{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Datawhale 零基础入门数据挖掘-Task5 建模调参 \n",
    "\n",
    "## 五、建模与调参\n",
    "\n",
    "Tip:此部分为零基础入门数据挖掘的 Task5 建模调参 部分，带你来了解各种模型以及模型的评价和调参策略，欢迎大家后续多多交流。\n",
    "\n",
    "**赛题：零基础入门数据挖掘 - 二手车交易价格预测**\n",
    "\n",
    "地址：https://tianchi.aliyun.com/competition/entrance/231784/introduction?spm=5176.12281957.1004.1.38b02448ausjSX \n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5.1 学习目标\n",
    "\n",
    "* 了解常用的机器学习模型，并掌握机器学习模型的建模与调参流程\n",
    "* 完成相应学习打卡任务"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5.2 内容介绍\n",
    "\n",
    "1. 线性回归模型：\n",
    "    - 线性回归对于特征的要求；\n",
    "    - 处理长尾分布；\n",
    "    - 理解线性回归模型；\n",
    "2. 模型性能验证：\n",
    "    - 评价函数与目标函数；\n",
    "    - 交叉验证方法；\n",
    "    - 留一验证方法；\n",
    "    - 针对时间序列问题的验证；\n",
    "    - 绘制学习率曲线；\n",
    "    - 绘制验证曲线；\n",
    "3. 嵌入式特征选择：\n",
    "    - Lasso回归；\n",
    "    - Ridge回归；\n",
    "    - 决策树；\n",
    "4. 模型对比：\n",
    "    - 常用线性模型；\n",
    "    - 常用非线性模型；\n",
    "5. 模型调参：\n",
    "    - 贪心调参方法；\n",
    "    - 网格调参方法；\n",
    "    - 贝叶斯调参方法；"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5.3 相关原理介绍与推荐\n",
    "\n",
    "由于相关算法原理篇幅较长，本文推荐了一些博客与教材供初学者们进行学习。\n",
    "\n",
    "### 5.3.1 线性回归模型\n",
    "\n",
    "https://zhuanlan.zhihu.com/p/49480391\n",
    "\n",
    "### 5.3.2 决策树模型\n",
    "\n",
    "https://zhuanlan.zhihu.com/p/65304798\n",
    "\n",
    "### 5.3.3 GBDT模型\n",
    "\n",
    "https://zhuanlan.zhihu.com/p/45145899\n",
    "\n",
    "### 5.3.4 XGBoost模型\n",
    "\n",
    "https://zhuanlan.zhihu.com/p/86816771\n",
    "\n",
    "### 5.3.5 LightGBM模型\n",
    "\n",
    "https://zhuanlan.zhihu.com/p/89360721\n",
    "\n",
    "### 5.3.6 推荐教材：\n",
    "\n",
    "   - 《机器学习》 https://book.douban.com/subject/26708119/\n",
    "   - 《统计学习方法》 https://book.douban.com/subject/10590856/\n",
    "   - 《Python大战机器学习》 https://book.douban.com/subject/26987890/\n",
    "   - 《面向机器学习的特征工程》 https://book.douban.com/subject/26826639/\n",
    "   - 《数据科学家访谈录》 https://book.douban.com/subject/30129410/\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5.4 代码示例"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5.4.1 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "reduce_mem_usage 函数通过调整数据类型，帮助我们减少数据在内存中占用的空间"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def reduce_mem_usage(df):\n",
    "    \"\"\" iterate through all the columns of a dataframe and modify the data type\n",
    "        to reduce memory usage.        \n",
    "    \"\"\"\n",
    "    start_mem = df.memory_usage().sum() \n",
    "    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))\n",
    "    \n",
    "    for col in df.columns:\n",
    "        col_type = df[col].dtype\n",
    "        \n",
    "        if col_type != object:\n",
    "            c_min = df[col].min()\n",
    "            c_max = df[col].max()\n",
    "            if str(col_type)[:3] == 'int':\n",
    "                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n",
    "                    df[col] = df[col].astype(np.int8)\n",
    "                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n",
    "                    df[col] = df[col].astype(np.int16)\n",
    "                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n",
    "                    df[col] = df[col].astype(np.int32)\n",
    "                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n",
    "                    df[col] = df[col].astype(np.int64)  \n",
    "            else:\n",
    "                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:\n",
    "                    df[col] = df[col].astype(np.float16)\n",
    "                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n",
    "                    df[col] = df[col].astype(np.float32)\n",
    "                else:\n",
    "                    df[col] = df[col].astype(np.float64)\n",
    "        else:\n",
    "            df[col] = df[col].astype('category')\n",
    "\n",
    "    end_mem = df.memory_usage().sum() \n",
    "    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))\n",
    "    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))\n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Memory usage of dataframe is 60507328.00 MB\n",
      "Memory usage after optimization is: 15724107.00 MB\n",
      "Decreased by 74.0%\n"
     ]
    }
   ],
   "source": [
    "sample_feature = reduce_mem_usage(pd.read_csv('data_for_tree.csv'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "continuous_feature_names = [x for x in sample_feature.columns if x not in ['price','brand','model','brand']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5.4.2 线性回归 & 五折交叉验证 & 模拟真实业务情况"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "sample_feature = sample_feature.dropna().replace('-', 0).reset_index(drop=True)\n",
    "sample_feature['notRepairedDamage'] = sample_feature['notRepairedDamage'].astype(np.float32)\n",
    "train = sample_feature[continuous_feature_names + ['price']]\n",
    "\n",
    "train_X = train[continuous_feature_names]\n",
    "train_y = train['price']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.4.2 - 1 简单建模"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = LinearRegression(normalize=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = model.fit(train_X, train_y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "查看训练的线性回归模型的截距（intercept）与权重(coef)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('v_6', 3342612.384537345),\n",
       " ('v_8', 684205.534533214),\n",
       " ('v_9', 178967.94192530424),\n",
       " ('v_7', 35223.07319016895),\n",
       " ('v_5', 21917.550249749802),\n",
       " ('v_3', 12782.03250792227),\n",
       " ('v_12', 11654.925634146672),\n",
       " ('v_13', 9884.194615297649),\n",
       " ('v_11', 5519.182176035517),\n",
       " ('v_10', 3765.6101415594258),\n",
       " ('gearbox', 900.3205339198406),\n",
       " ('fuelType', 353.5206495542567),\n",
       " ('bodyType', 186.51797317460046),\n",
       " ('city', 45.17354204168846),\n",
       " ('power', 31.163045441455335),\n",
       " ('brand_price_median', 0.535967111869784),\n",
       " ('brand_price_std', 0.4346788365040235),\n",
       " ('brand_amount', 0.15308295553300566),\n",
       " ('brand_price_max', 0.003891831020467389),\n",
       " ('seller', -1.2684613466262817e-06),\n",
       " ('offerType', -4.759058356285095e-06),\n",
       " ('brand_price_sum', -2.2430642281682917e-05),\n",
       " ('name', -0.00042591632723759166),\n",
       " ('used_time', -0.012574429533889028),\n",
       " ('brand_price_average', -0.414105722833381),\n",
       " ('brand_price_min', -2.3163823428971835),\n",
       " ('train', -5.392535065078232),\n",
       " ('power_bin', -59.24591853031839),\n",
       " ('v_14', -233.1604256172217),\n",
       " ('kilometer', -372.96600915402496),\n",
       " ('notRepairedDamage', -449.29703564695365),\n",
       " ('v_0', -1490.6790578168238),\n",
       " ('v_4', -14219.648899108111),\n",
       " ('v_2', -16528.55239086934),\n",
       " ('v_1', -42869.43976200439)]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'intercept:'+ str(model.intercept_)\n",
    "\n",
    "sorted(dict(zip(continuous_feature_names, model.coef_)).items(), key=lambda x:x[1], reverse=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "subsample_index = np.random.randint(low=0, high=len(train_y), size=50)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "绘制特征v_9的值与标签的散点图，图片发现模型的预测结果（蓝色点）与真实标签（黑色点）的分布差异较大，且部分预测值出现了小于0的情况，说明我们的模型存在一些问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The predicted price is obvious different from true price\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZcAAAELCAYAAAAVwss1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3X14XGWd//H3N2lLCbBQQlmQ0knlV5FSSmgDluVJngooK6KwFAKUBQ0UEAV1gV+WS65dsoIPKP6WB4MiD4mUiqB1FyygqCwCJYWCFISmkLQFFkop0lKe2nx/f5yTMklmksnkzJwzM5/XdZ1rZu4558w9k8z5zrnv+3xvc3dERESiVBV3BUREpPwouIiISOQUXEREJHIKLiIiEjkFFxERiZyCi4iIRE7BRUREIqfgIiIikVNwERGRyI0q9AuY2VjgT8AW4evd6e7fMrNJwDxge+AJ4DR3/8DMtgBuBWYAa4CT3L0r3NelwFnAJuACd18Ylh8NXANUAz9x9yuHqtcOO+zgdXV1Ub5VEZGyt3jx4jfcffxQ6xU8uADvA4e5+3ozGw38j5ndC1wE/MDd55nZDQRB4/rwdq27/x8zmw1cBZxkZlOA2cCewMeAB8zsE+FrXAscCawCHjezBe7+7GCVqquro6OjI/p3KyJSxsysO5f1Ct4s5oH14cPR4eLAYcCdYfktwOfD+8eFjwmfP9zMLCyf5+7vu/tLQCewX7h0uvuL7v4BwdnQcQV+WyIiMoii9LmYWbWZLQFeB+4HlgNvufvGcJVVwC7h/V2AlQDh838DatPL+22TrVxERGJSlODi7pvcvR6YQHCmsUem1cJby/LccMsHMLMmM+sws47Vq1cPXXEREclLMfpcNnP3t8zsD8BMYDszGxWenUwAXglXWwXsCqwys1HAtsCbaeW90rfJVt7/9VuBVoCGhgbNNSBSYB9++CGrVq3ivffei7sqMkxjx45lwoQJjB49Oq/tizFabDzwYRhYtgSOIOikfxA4gaCPZA7w63CTBeHjR8Lnf+/ubmYLgJ+b2dUEHfqTgUUEZy6Tw9FnLxN0+p9S6PclIkNbtWoV22yzDXV1dQRdp1IK3J01a9awatUqJk2alNc+itEstjPwoJk9DTwO3O/u/wVcDFxkZp0EfSo/Ddf/KVAbll8EXALg7kuB+cCzwG+B88Lmto3A+cBC4DlgfriulIn29nbq6uqoqqqirq6O9vb2uKskOXrvvfeora1VYCkxZkZtbe2IzjgLfubi7k8D+2Qof5Gg/6V/+XvAiVn21QK0ZCi/B7hnxJWVxGlvb6epqYkNGzYA0N3dTVNTEwCNjY1xVk1ypMBSmkb6d9MV+pJozc3NmwNLrw0bNtDc3BxTjUQkFwoukmgrVqwYVrlIujVr1lBfX099fT077bQTu+yyy+bHH3zwQWSv88ADD7DttttSX1/PHnvsQUvLgAYWAFauXMlJJ50U2esmWVFHi4kM18SJE+nuHnhB8MSJE2OojZSa2tpalixZAsDll1/O1ltvzTe+8Y0+67g77k5V1ch+ax966KH86le/Yv369UybNo1jjz2Wvffee/PzGzduZNddd+WOO+4Y0euUCp25SKK1tLRQU1PTp6ympibrL0MpbcUavNHZ2cnUqVM555xzmD59OitXrmS77bbb/Py8efP40pe+BMBrr73GF77wBRoaGthvv/149NFHB9331ltvzfTp01m+fDk/+clPmD17NsceeyzHHHMMnZ2d1NfXA0GwufDCC5k6dSrTpk3juuuuA+Dxxx/nkEMOYcaMGRxzzDG89tprBfkMCk3BRRKtsbGR1tZWUqkUZkYqlaK1tVWd+WWod/BGd3c37r558EahAsyzzz7LWWedxZNPPskuu2RP6nHBBRfwL//yL3R0dDB//vzNQSeb1atXs2jRIvbcc08AHnnkEW677Tbuv//+Putdf/31vPLKKzz11FM8/fTTzJ49m/fff5+vfvWr/PKXv2Tx4sWceuqpXHbZZSN/szFQs5gkXmNjo4JJBRhs8EYh/v677bYb++6775DrPfDAAzz//PObH69du5Z3332XLbfcss96Dz74IPvssw9VVVVcdtll7L777jz00EPMmjWLcePGZdzv1772NaqrqwHYfvvtWbJkCUuXLuWII44AYNOmTUyYMGEkbzM2Ci4ikgjFHryx1VZbbb5fVVWF+0dJO9Kv73B3Fi1axJgxYwbdX2+fy2Cvk87dBwz3dXemTZvGQw89lNN7SDI1i4lIImQbpFGMwRtVVVWMGzeOZcuW0dPTw9133735uSOOOIJrr7128+PeAQIjNWvWLK6//no2bdoEwJtvvsmUKVN4+eWXWbRoEQAffPABS5eW5jXhCi4ikghxD9646qqrOProozn88MP7NEVde+21PPzww0ybNo0pU6Zw4403RvJ6Z599NjvttBPTpk1j7733Zv78+WyxxRbceeedXHTRRey9997ss88+PPbYY5G8XrFZ+qlgJWloaHBNFiZSWM899xx77JEpCXpm7e3tNDc3s2LFCiZOnEhLS4v622KU6e9nZovdvWGobdXnIiKJocEb5UPNYiIiEjkFFxERiZyCi4iIRE7BRUREIqfgIiIikVNwEZGyVl1dTX19PVOnTuXEE08ckGJmOP7whz9w7LHHArBgwQKuvPLKrOu+9dZbm5NRDsfll1/O9773vYzlvVMGTJ06lQULFmTcfqh6FYuCi4iUtS233JIlS5bwzDPPMGbMGG644YY+z7s7PT09w97v5z73OS655JKsz+cbXAZz4YUXsmTJEn7xi19w5plnDqj3xo0bh6xXsSi4iEhitLdDXR1UVQW3USdEPuigg+js7KSrq4s99tiDc889d3PK/fvuu4/999+f6dOnc+KJJ7J+/XoAfvvb3/LJT36SAw88kLvuumvzvm6++WbOP/98IEjLf/zxx7P33nuz99578+c//5lLLrmE5cuXU19fzze/+U0Avvvd77Lvvvsybdo0vvWtb23eV0tLC7vvvjtHHHFEnySZ2eyxxx6MGjWKN954gzPOOIOLLrqIQw89lIsvvnjIegG0tbWx3377UV9fz9lnn705BU2UFFxEJBHa26GpCbq7wT24bWqKLsBs3LiRe++9l7322guA559/ntNPP50nn3ySrbbaiiuuuIIHHniAJ554goaGBq6++mree+89vvzlL/Ob3/yGhx56iP/93//NuO8LLriAQw45hKeeeoonnniCPffckyuvvJLddtuNJUuW8N3vfpf77ruPZcuWsWjRIpYsWcLixYv505/+xOLFi5k3bx5PPvkkd911F48//viQ7+Wxxx6jqqqK8ePHA/DCCy/wwAMP8P3vf3/Iej333HPccccdPPzwwyxZsoTq6uqCTGugK/RFJBGam6F/d8iGDUH5SC7af/fddzdP0HXQQQdx1lln8corr5BKpZg5cyYAjz76KM8++ywHHHAAECSM3H///fnrX//KpEmTmDx5MgCnnnoqra2tA17j97//PbfeeisQ9PFsu+22rF27ts869913H/fddx/77LMPAOvXr2fZsmWsW7eO448/fnNe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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(train_X['v_9'][subsample_index], train_y[subsample_index], color='black')\n",
    "plt.scatter(train_X['v_9'][subsample_index], model.predict(train_X.loc[subsample_index]), color='blue')\n",
    "plt.xlabel('v_9')\n",
    "plt.ylabel('price')\n",
    "plt.legend(['True Price','Predicted Price'],loc='upper right')\n",
    "print('The predicted price is obvious different from true price')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过作图我们发现数据的标签（price）呈现长尾分布，不利于我们的建模预测。原因是很多模型都假设数据误差项符合正态分布，而长尾分布的数据违背了这一假设。参考博客：https://blog.csdn.net/Noob_daniel/article/details/76087829"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "It is clear to see the price shows a typical exponential distribution\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1b33efb2f98>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "print('It is clear to see the price shows a typical exponential distribution')\n",
    "plt.figure(figsize=(15,5))\n",
    "plt.subplot(1,2,1)\n",
    "sns.distplot(train_y)\n",
    "plt.subplot(1,2,2)\n",
    "sns.distplot(train_y[train_y < np.quantile(train_y, 0.9)])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在这里我们对标签进行了 $log(x+1)$ 变换，使标签贴近于正态分布"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_y_ln = np.log(train_y + 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The transformed price seems like normal distribution\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1b33f077160>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sns\n",
    "print('The transformed price seems like normal distribution')\n",
    "plt.figure(figsize=(15,5))\n",
    "plt.subplot(1,2,1)\n",
    "sns.distplot(train_y_ln)\n",
    "plt.subplot(1,2,2)\n",
    "sns.distplot(train_y_ln[train_y_ln < np.quantile(train_y_ln, 0.9)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "intercept:23.515920686637713\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[('v_9', 6.043993029165403),\n",
       " ('v_12', 2.0357439855551394),\n",
       " ('v_11', 1.3607608712255672),\n",
       " ('v_1', 1.3079816298861897),\n",
       " ('v_13', 1.0788833838535354),\n",
       " ('v_3', 0.9895814429387444),\n",
       " ('gearbox', 0.009170812023421397),\n",
       " ('fuelType', 0.006447089787635784),\n",
       " ('bodyType', 0.004815242907679581),\n",
       " ('power_bin', 0.003151801949447194),\n",
       " ('power', 0.0012550361843629999),\n",
       " ('train', 0.0001429273782925814),\n",
       " ('brand_price_min', 2.0721302299502698e-05),\n",
       " ('brand_price_average', 5.308179717783439e-06),\n",
       " ('brand_amount', 2.8308531339942507e-06),\n",
       " ('brand_price_max', 6.764442596115763e-07),\n",
       " ('offerType', 1.6765966392995324e-10),\n",
       " ('seller', 9.308109838457312e-12),\n",
       " ('brand_price_sum', -1.3473184925468486e-10),\n",
       " ('name', -7.11403461065247e-08),\n",
       " ('brand_price_median', -1.7608143661053008e-06),\n",
       " ('brand_price_std', -2.7899058266986454e-06),\n",
       " ('used_time', -5.6142735899344175e-06),\n",
       " ('city', -0.0024992974087053223),\n",
       " ('v_14', -0.012754139659375262),\n",
       " ('kilometer', -0.013999175312751872),\n",
       " ('v_0', -0.04553774829634237),\n",
       " ('notRepairedDamage', -0.273686961116076),\n",
       " ('v_7', -0.7455902679730504),\n",
       " ('v_4', -0.9281349233755761),\n",
       " ('v_2', -1.2781892166433606),\n",
       " ('v_5', -1.5458846136756323),\n",
       " ('v_10', -1.8059217242413748),\n",
       " ('v_8', -42.611729973490604),\n",
       " ('v_6', -241.30992120503035)]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = model.fit(train_X, train_y_ln)\n",
    "\n",
    "print('intercept:'+ str(model.intercept_))\n",
    "sorted(dict(zip(continuous_feature_names, model.coef_)).items(), key=lambda x:x[1], reverse=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再次进行可视化，发现预测结果与真实值较为接近，且未出现异常状况"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The predicted price seems normal after np.log transforming\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(train_X['v_9'][subsample_index], train_y[subsample_index], color='black')\n",
    "plt.scatter(train_X['v_9'][subsample_index], np.exp(model.predict(train_X.loc[subsample_index])), color='blue')\n",
    "plt.xlabel('v_9')\n",
    "plt.ylabel('price')\n",
    "plt.legend(['True Price','Predicted Price'],loc='upper right')\n",
    "print('The predicted price seems normal after np.log transforming')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.4.2 - 2 五折交叉验证"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "> 在使用训练集对参数进行训练的时候，经常会发现人们通常会将一整个训练集分为三个部分（比如mnist手写训练集）。一般分为：训练集（train_set），评估集（valid_set），测试集（test_set）这三个部分。这其实是为了保证训练效果而特意设置的。其中测试集很好理解，其实就是完全不参与训练的数据，仅仅用来观测测试效果的数据。而训练集和评估集则牵涉到下面的知识了。\n",
    "\n",
    ">因为在实际的训练中，训练的结果对于训练集的拟合程度通常还是挺好的（初始条件敏感），但是对于训练集之外的数据的拟合程度通常就不那么令人满意了。因此我们通常并不会把所有的数据集都拿来训练，而是分出一部分来（这一部分不参加训练）对训练集生成的参数进行测试，相对客观的判断这些参数对训练集之外的数据的符合程度。这种思想就称为交叉验证（Cross Validation）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "from sklearn.metrics import mean_absolute_error,  make_scorer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "def log_transfer(func):\n",
    "    def wrapper(y, yhat):\n",
    "        result = func(np.log(y), np.nan_to_num(np.log(yhat)))\n",
    "        return result\n",
    "    return wrapper"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    1.1s finished\n"
     ]
    }
   ],
   "source": [
    "scores = cross_val_score(model, X=train_X, y=train_y, verbose=1, cv = 5, scoring=make_scorer(log_transfer(mean_absolute_error)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用线性回归模型，对未处理标签的特征数据进行五折交叉验证（Error 1.36）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AVG: 1.3641908155886227\n"
     ]
    }
   ],
   "source": [
    "print('AVG:', np.mean(scores))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用线性回归模型，对处理过标签的特征数据进行五折交叉验证（Error 0.19）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n",
      "[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    1.1s finished\n"
     ]
    }
   ],
   "source": [
    "scores = cross_val_score(model, X=train_X, y=train_y_ln, verbose=1, cv = 5, scoring=make_scorer(mean_absolute_error))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AVG: 0.19382863663604424\n"
     ]
    }
   ],
   "source": [
    "print('AVG:', np.mean(scores))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>cv1</th>\n",
       "      <th>cv2</th>\n",
       "      <th>cv3</th>\n",
       "      <th>cv4</th>\n",
       "      <th>cv5</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>MAE</th>\n",
       "      <td>0.191642</td>\n",
       "      <td>0.194986</td>\n",
       "      <td>0.192737</td>\n",
       "      <td>0.195329</td>\n",
       "      <td>0.19445</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          cv1       cv2       cv3       cv4      cv5\n",
       "MAE  0.191642  0.194986  0.192737  0.195329  0.19445"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scores = pd.DataFrame(scores.reshape(1,-1))\n",
    "scores.columns = ['cv' + str(x) for x in range(1, 6)]\n",
    "scores.index = ['MAE']\n",
    "scores"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.4.2 - 3 模拟真实业务情况"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "但在事实上，由于我们并不具有预知未来的能力，五折交叉验证在某些与时间相关的数据集上反而反映了不真实的情况。通过2018年的二手车价格预测2017年的二手车价格，这显然是不合理的，因此我们还可以采用时间顺序对数据集进行分隔。在本例中，我们选用靠前时间的4/5样本当作训练集，靠后时间的1/5当作验证集，最终结果与五折交叉验证差距不大"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "import datetime"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "sample_feature = sample_feature.reset_index(drop=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "split_point = len(sample_feature) // 5 * 4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "train = sample_feature.loc[:split_point].dropna()\n",
    "val = sample_feature.loc[split_point:].dropna()\n",
    "\n",
    "train_X = train[continuous_feature_names]\n",
    "train_y_ln = np.log(train['price'] + 1)\n",
    "val_X = val[continuous_feature_names]\n",
    "val_y_ln = np.log(val['price'] + 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = model.fit(train_X, train_y_ln)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.19443858353490887"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mean_absolute_error(val_y_ln, model.predict(val_X))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.4.2 - 4 绘制学习率曲线与验证曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import learning_curve, validation_curve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "? learning_curve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,n_jobs=1, train_size=np.linspace(.1, 1.0, 5 )):  \n",
    "    plt.figure()  \n",
    "    plt.title(title)  \n",
    "    if ylim is not None:  \n",
    "        plt.ylim(*ylim)  \n",
    "    plt.xlabel('Training example')  \n",
    "    plt.ylabel('score')  \n",
    "    train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_size, scoring = make_scorer(mean_absolute_error))  \n",
    "    train_scores_mean = np.mean(train_scores, axis=1)  \n",
    "    train_scores_std = np.std(train_scores, axis=1)  \n",
    "    test_scores_mean = np.mean(test_scores, axis=1)  \n",
    "    test_scores_std = np.std(test_scores, axis=1)  \n",
    "    plt.grid()#区域  \n",
    "    plt.fill_between(train_sizes, train_scores_mean - train_scores_std,  \n",
    "                     train_scores_mean + train_scores_std, alpha=0.1,  \n",
    "                     color=\"r\")  \n",
    "    plt.fill_between(train_sizes, test_scores_mean - test_scores_std,  \n",
    "                     test_scores_mean + test_scores_std, alpha=0.1,  \n",
    "                     color=\"g\")  \n",
    "    plt.plot(train_sizes, train_scores_mean, 'o-', color='r',  \n",
    "             label=\"Training score\")  \n",
    "    plt.plot(train_sizes, test_scores_mean,'o-',color=\"g\",  \n",
    "             label=\"Cross-validation score\")  \n",
    "    plt.legend(loc=\"best\")  \n",
    "    return plt  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<module 'matplotlib.pyplot' from 'C:\\\\ProgramData\\\\Anaconda3\\\\lib\\\\site-packages\\\\matplotlib\\\\pyplot.py'>"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEWCAYAAACJ0YulAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XecVPW5+PHPM2X70olKEzBYFpbm0hQptiAajahXDSbRGyAmklhuVAzGn8GgxBhL1GvBEq+XiMYW4sUYC1hiAxUL2JDmAkrd3qY8vz/OzNnZ2dnd2TLLLjzv12tec8r3nPPM7Oz3Oed7zvkeUVWMMcYYAM++DsAYY0zHYUnBGGOMy5KCMcYYlyUFY4wxLksKxhhjXJYUjDHGuCwpGGOMcVlSMPsdETlORD7f13G0JRH5i4j8Psmym0TkxFTHZPZPlhRMp5aoAlTV11X1iH0VkzGdmSUFY5IkIr59HYMxqWZJwex3RGSKiBTGjG8SkV+LyEciUiwij4tIRsz800RkjYgUicibIjI8btmrReQjoLyxxBApe2VkO+Ui8qCIHCQiz4tIqYi8JCLdY8qfLiJrI9tdKSJHxcwbJSLvR5Z7HMiI21aDMRvTGpYUzIHiP4BpwCBgOHAhgIiMBh4Cfgb0BO4DlolIesyy5wOnAt1UNdjEds4CTgIOB74PPA/8BuiF8//2q8h2DwceAy4DegPLgX+ISJqIpAHPAo8CPYC/RdZLM2I2pkUsKZgDxZ9VdZuq7gH+AYyMTJ8N3Keq76hqSFUfAaqB8XHLfq2qlUls505V/VZVtwKvA++o6geqWg08A4yKlDsX+D9VfVFVA8AtQCZwTGTbfuB2VQ2o6pPAqphtJBOzMS1iScEcKL6JGa4AciLDhwL/FWmGKRKRIqA/0Cem/NfN2M63McOVCcaj2+0DbI7OUNVwZDt9I/O2at0ujDfHDCcTszEtYifOzIHua2Chqi5spEwq+pffBuRHR0REcCr2rZHt9RURiUkMA4CvIsPJxGxMi9iRgtkf+EUkI/qieTs7i4GLRWScOLJF5FQRyU1RrFFPAKeKyAki4gf+C6cJ6E3gLSAI/EpEfCIyAxjbAWI2BwBLCmZ/sBynaSb6uj7ZBVV1NU4b/V3AXmA9kZPQqaSqnwMXAHcCu3BOSn9fVWtUtQaYEYljL875h6f3dczmwCD25DVjjDFRKT1SEJFpIvK5iKwXkXkJ5l8oIjsj11uvEZFZqYzHGGNM41J2ollEvMDdONdsFwKrRGSZqq6LK/q4qs5NVRzGtBURGQDE/36j8lR1S3vGY0wqpPLqo7HAelXdACAiS4EzaPifypgOLVLp5zRZ0JhOLJVJoS91r+8uBMYlKHeWiEwCvgAuV9V614SLyBxgDkBmZubR/fv3T0G4jnA4jMfT8c+/W5xtr7PEanG2rc4SJ7Qu1i+++GKXqvZusqCqpuQFnAM8EDP+I5y7PWPL9ATSI8MXA680td6jjz5aU2nFihUpXX9bsTjbXmeJ1eJsW50lTtXWxQqs1iTq7lSmx0Kcm3Gi+uHcsBObkHarc/s/ONdeH53CeIwxxjQhlUlhFTBERAZFOvg6D1gWW0BEDokZPR34NIXxGGOMaULKzimoalBE5gIvAF7gIVVdKyILcA5jluHcsXk6zt2be7AbcIwxZp9Kad9Hqroc527T2GnXxQxfA1yTyhiM6SwCgQCFhYVUVVU1Wq5r1658+mnHP6i2ONteMrFmZGTQr18//H5/i7ZhHeIZ00EUFhaSm5vLwIEDcfrHS6y0tJTc3I7fzZHF2faailVV2b17N4WFhQwaNKhF2+gc12EZcwCoqqqiZ8+ejSYEYxojIvTs2bPJo83GWFIwpgOxhGBaq7W/IUsKxhhjXJYUjDEA7N69m5EjRzJy5EgOPvhg+vbt647X1NQktY6LLrqIzz//vNEyd999N0uWLGmLkE0K2IlmYzqrJUtg/nzYsgUGDICFC2HmzBavrmfPnqxZswaA66+/npycHH7961/XKePe9dpAVwsPP/xwk9u55JJLWhxjKjX12Q4UB/anN6azWrIE5syBzZtB1XmfM8eZ3sbWr1/PsGHDuPjiixk9ejTbt29nzpw5FBQUMHToUBYsWOCWnThxImvWrCEYDNK/f3/mzZvHiBEjmDBhAjt27ADg2muv5fbbb3fLz5s3j7Fjx3LEEUfw5ptvAlBeXs5ZZ53FiBEjOP/88ykoKHATVqwrr7ySvLw8hg8fztVXXw3AN998wxlnnMHw4cMZMWIE77zzDgA333wzw4YNY9iwYdx5553uZxs3blydz/b8888zYcIERo8ezbnnnkt5eXmbf6cdmR0pGNMRXXYZJKgEATJDIVi1Cqqr686oqICf/hQWL068zpEjIVIZN9e6det4+OGHuffeewFYtGgRPXr0IBgMMnXqVM4++2zy8vLqLFNcXMzkyZNZtGgRV1xxBQ899BDz5tV7rAqqyrvvvsuyZctYsGAB//znP7nzzjs5+OCDeeqpp/jwww8ZPXp0veW+/fZbli9fztq1axERioqKAOdI5KSTTmLu3LkEg0EqKip49913WbJkCe+++y6hUIixY8cyefJksrKy+Oyzz3jkkUe499572bFjB4sWLeLll18mKyuLhQsXcscdd/Cb3/ymRd9bZ2RHCsZ0RvEJoanprXTYYYcxZswYd/yxxx5j9OjRjB49mk8//ZR16+r3iJ+Zmckpp5wCwNFHH82mTZsSrnvGjBn1yrzxxhucd955AIwYMYKhQ4fWW65Hjx54PB5mz57NM888Q3Z2NgArV67kZz/7GQA+n48uXbrw+uuvc9ZZZ5GVlUVubi4/+MEPeOONNwAYNGiQ+9nefPNN1q1bxzHHHMPIkSNZsmRJg3Hvr+xIwZiOqJE9+srSUnLz850mo3iHHgorV7Z5ONEKF+DLL7/kjjvu4N1336Vbt25ccMEFCa+LT0tLc4e9Xi/BYDDhutPT0+uV0SQeE+z3+1m9ejUvvvgiS5cu5Z577uFf//oXUP+yzMbWF/vZVJVp06bx6KOPNrn9/ZUdKRjTGS1cCFlZdadlZTnTU6ykpITc3Fy6dOnC9u3beeGFF9p8GxMnTuSJJ54A4OOPP054JFJaWkpJSQmnnXYat912Gx988AEAU6dOdZu5QqEQJSUlTJo0iWeeeYbKykrKysr4+9//znHHHVdvnccccwyvvvoqGzZsAJxzG19++WWbf76OzI4UjOmMolcZteHVR8kaPXo0eXl5DBs2jMGDB3Pssce2+TZ++ctf8uMf/5jhw4czevRohg0bRteuXeuUKS4uZsaMGVRXVxMOh7n11lsBuOuuu5g9ezb33XcfPp+P++67j7Fjx3L++ee7zUQ///nPyc/PZ/369XXWedBBB/Hggw9y7rnnupfh3njjjQwZMqTNP2OHlcxDFzrSyx6y47A4296+jnXdunVJlSspKUlxJG2jNXEGAgGtrKxUVdUvvvhCBw4cqIFAoK1Cq6OzfJ+qycea6LdEkg/ZsSMFY0yHU1ZWxgknnEAwGERV3b1+k3r2LRtjOpxu3brx3nvv7eswDkh2otkYY4zLkoIxxhiXJQVjjDEuSwrGGGNclhSMMa5vvvmG8847j8MOO4y8vDymT5/OF198sa/DSmjgwIHs2rULcG46S+TCCy/kySefbHQ9S5YsYdu2be74rFmzEt4sd6CwpGBMJ7Xk4yUMvH0gnt95GHj7QJZ83LoeUlWVM888kylTpvDVV1+xbt06brzxRr799ts65UKhUKu2kwrR3lVbIj4pPPDAA/U69+sIGuompK1ZUjCmE1ry8RLm/GMOm4s3oyibizcz5x9zWpUYVqxYgd/v5+KLL3anjRw5kuOOO46VK1cydepUfvjDH5Kfnw/Arbfe6nZFHe0Ku7y8nFNPPZURI0Ywbtw4Hn/8cQDmzZvndnEd/4wGgHvuuYerrrrKHf/LX/7CL3/5SwB+8IMfcPTRRzN06FDuv//+hLHn5OQATmKbO3cueXl5nHrqqW533QALFixgzJgxDBs2jDlz5qCqPPnkk3zwwQfMnDmTkSNHUllZyZQpU1i9ejXgdPyXn5/PsGHD3K65o9ubP38+I0aMYPz48fUSJ8Crr77qPqRo1KhRlJaWAk4X3vn5+YwYMcLtNXbNmjWMHz+e4cOHc+aZZ7J3714ApkyZwm9+8xsmT57MHXfcwa5duzjrrLMYM2YMY8aM4d///nfDf9CWSuYOt470sjuaHRZn29vXscbehXrp85fq5IcnJ3xNfGCipt+QrlxPvVf6DekNLnfp85c2uv077rhDL7vssoTzVqxYoVlZWbphwwZVVV29erUOGzZMy8rKtLS0VPPy8vT999/XJ598UmfNmqWqzt23RUVFunv3bj388MM1HA6rqurevXvrrX/Hjh162GGHuePTpk3T119/XVVVd+/eraqqFRUVOnToUN21a5eqqh566KG6c+dOVVXNzs5WVdWnnnpKTzzxRA0Gg7p161bt2rWr/u1vf6uzHlXVCy64QJctW6aqqhMnTtRVq1a58yZPnqyrVq3SrVu3av/+/XXHjh0aCAR06tSp+swzz6iqKuAuf+WVV+oNN9xQ7zOddtpp+sYbb6iqamlpqQYCAV2+fLlOmDBBy8vL68SUn5+vK1euVFXV3/72t3rppZe6sfz85z9313n22We738vmzZv1yCOPrP/H0tbd0WxHCsZ0QtWhxF1kNzS9LYwdO5ZBgwYBTtfWZ555JtnZ2eTk5DBjxgxef/118vPzeemll7j66qt588036dq1K126dCEjI4NZs2bx9NNPkxXfkR/Qu3dvBg8ezNtvv83u3bv5/PPP3T6V/vznP7t75F9//XWjHdS99tprnH/++Xi9Xvr06cPxxx/vzluxYgXjxo0jPz+fV155hbVr1zb6eVetWsWUKVPo3bs3Pp+PmTNn8tprrwFOD7CnnXYa0HC34MceeyxXXHEFf/7znykqKsLn8/HSSy9x0UUXud9Bjx49KC4upqioiMmTJwPwk5/8xN0OwLnnnusOr1y5krlz5zJy5EhOP/10SkpK3COQtmJ3NBvTAd0+reGus0tLS8l/MJ/NxfW7zj6066GsvHBli7Y5dOjQRk/Kxncxncjhhx/Oe++9x/Lly7n++ut55513uO6663j33Xd5+eWXWbp0KXfddRcvvvgiRx99NACnn346CxYs4Nxzz+WJJ57gyCOP5Mwzz0REWLlyJS+99BJvvfUWWVlZTJkyJWE33bHiu80GqKqq4he/+AWrV6+mf//+XH/99U2up6HPCE633dHtNNQt+Lx58zj11FNZvnw548eP56WXXkJVE8bXmNjvPRwO89Zbb5GZmdmsdTSHHSkY0wktPGEhWf66e9xZ/iwWntDyrrOPP/54qqurWRzz5LZVq1bx6quv1is7adIknn32WSoqKigvL+eZZ57huOOOY9u2bWRlZXHBBRfwq1/9ivfff5+ysjKKi4uZPn06t99+O2vWrMHr9bJmzRrWrFnjPs5zxowZPPvsszz22GPu3nFxcTHdu3d3n5D29ttvN/oZJk2axNKlSwmFQmzfvp0VK1YAuAmgV69elJWV1Ul+OTk5Cfe2x40bx6uvvsquXbsIhUI89thj7t58Mr766ivy8/O5+uqrKSgo4LPPPuPkk0/moYceoqKiAoA9e/bQtWtXunfvzuuvvw7Ao48+2uB2jj/+eO666y53PNEjSlvLjhSM6YRm5jtdZM9/eT5bircwoOsAFp6w0J3eEiLCM888w2WXXcaiRYvIyMhg4MCB3H777WzdurVO2dGjR3PhhRcyduxYwLmMc9SoUbzwwgtceeWVeDwePB4P999/P6WlpZxxxhlUVVWhqtx2220Jt9+9e3fy8vJYt26du95p06Zx7733Mnz4cI444gjGjx/f6Gc488wzeeWVV8jPz+fwww93K9du3boxe/Zs8vPzGThwYJ2nyM2cOZOLL76YzMxM3nrrLXf6IYccwk033cTUqVNRVaZPn84ZZ5yR9Pd5++23s2LFCrxeL3l5eZxyyimkp6ezZs0aCgoKSEtLY/r06dx444088sgjXHzxxVRUVDB48GAefvjhhOv84x//yNVXX83w4cMJBoNMmjTJfXZEW5HGDpE6ooKCAo1eGZAKK1euZMqUKSlbf1uxONvevo71008/5aijjmqyXGlpKbm5ue0QUetYnG0v2VgT/ZZE5D1VLWhqWWs+MsYY47KkYIwxxmVJwZgOpLM155qOp7W/IUsKxnQQGRkZ7N692xKDaTFVZffu3WRkZLR4HXb1kTEdRL9+/SgsLGTnzp2NlquqqmrVP317sTjbXjKxZmRk0K9fvxZvw5KCMR2E3+937xhuzMqVKxk1alQ7RNQ6Fmfba49YrfnIGGOMK6VJQUSmicjnIrJeROY1Uu5sEVERafIaWmOMMamTsqQgIl7gbuAUIA84X0TqdVIuIrnAr4B3UhWLMcaY5KTySGEssF5VN6hqDbAUSHSP+A3AzUDjvVMZY4xJuZR1cyEiZwPTVHVWZPxHwDhVnRtTZhRwraqeJSIrgV+rar0+LERkDjAH4KCDDjp66dKlKYkZoKyszH1gR0dmcba9zhKrxdm2Okuc0LpYp06dmlQ3Fyl7GA5wDvBAzPiPgDtjxj3ASmBgZHwlUNDUeu0hOw6Ls+11llgtzrbVWeJUbV2sdICH7BQC/WPG+wHbYsZzgWHAShHZBIwHltnJZmOM2XdSmRRWAUNEZJCIpAHnAcuiM1W1WFV7qepAVR0IvA2crgmaj4wxxrSPlCUFVQ0Cc4EXgE+BJ1R1rYgsEJHTU7VdY4wxLZfSO5pVdTmwPG7adQ2UnZLKWIwxxjTN7mg2xhjjsqRgjDHGZUnBGGOMy5KCMcYYlyUFY4wxLksKxhhjXJYUjDHGuCwpGGOMcVlSMMYY47KkYIwxxmVJwRhjjMuSgjHGGJclBWOMMS5LCsYYY1yWFIwxxrgsKRhjjHFZUjDGGOOypGCMMcZlScEYY4zLkoIxxhiXJQVjjDEuSwrGGGNclhSMMca4LCkYY4xxWVIwxhjjsqRgjDHGZUnBGGOMy5KCMcYYlyUFY4wxLksKxhhjXJYUjDHGuCwpGGOMcVlSMMYY47KkYIwxxpXSpCAi00TkcxFZLyLzEsy/WEQ+FpE1IvKGiOSlMp6qYBXVwepUbsIYYzq1lCUFEfECdwOnAHnA+Qkq/b+qar6qjgRuBm5NVTwAxVXFfLX3K7aXbrfkYIwxCaTySGEssF5VN6hqDbAUOCO2gKqWxIxmA5rCeADI8GVQEahg496NbCvdRlWwKtWbNMaYTkNUU1MPi8jZwDRVnRUZ/xEwTlXnxpW7BLgCSAOOV9UvE6xrDjAH4KCDDjp66dKlLYopGA4S1jAiAkBYw6gqXo8Xn8eHIJSVlZGTk9Oi9bcni7PtdZZYLc621VnihNbFOnXq1PdUtaCpcr4WrT05kmBavQykqncDd4vID4FrgZ8kKHM/cD9AQUGBTpkypUUBfVv2LeWBcjJ8GXWmVwWrCIQCZPuz+fKDL2np+tvTypUrLc421llitTjbVmeJE9on1lQ2HxUC/WPG+wHbGim/FPhBCuNpUIYvg9z0XGrCNVQHqyksLqQyULkvQjHGmH0qlUlhFTBERAaJSBpwHrAstoCIDIkZPRWo13TUnjJ8GXg9XmrCNWwp3sLXxV9bcjDGHFBS1nykqkERmQu8AHiBh1R1rYgsAFar6jJgroicCASAvSRoOtoXMnwZZPgyqA5Ws6V4C5n+THpn9SbTn7mvQzPGmJRK5TkFVHU5sDxu2nUxw5emcvtRSz5ewvyX57OleAuH5B7CNROvYcZRM5pcLt2XTrovnepgNZuLNpOVlkWvrF5k+jLdk9XGGLM/SWlS6AiWfLyEOf+YQ0WgAoBtpdu46sWrAJJKDFA3OXxd/DUZvgx6Z/e25GCM2e/s991czH95vpsQoiqDlSx6Y1Gz15XuSyc3PRdF+br4azYXbaa8ppxUXdZrjDHtbb9PCluKtyScvrV0K28Xvt2iCj3Nm0Zuei4IfF1iycEYs//Y75PCgK4DEk4XhLOeOItpS6bxt3V/a1G3F2neNLqkdwGBwpJCSw7GmE5vv08KC09YSJY/q860TF8mfzr5T/zhxD9QHazmsn9exvgHx3Pb27dRVFPU7G1EjxxEhMKSQjYVbaKspsySgzGm00n6RLOITASGqOrDItIbyFHVjakLrW3MzJ8J0ODVRzPzZ/La5tdY/P5ibnnzFvzi5+zys/npqJ9yVO+jmrUtv9eP3+snEApQWFxImi+N3lm9yUnLsRPSxphOIamkICL/DygAjgAeBvzA/wLHpi60tjMzfyYz82cm7OZCRJg8cDKTB07my91f8scX/sgznz3DY588xnEDjmPW6FkcP+h4PJL8QVVscthWug2/x0/vbEsOxpiOL9ma7kzgdKAcQFW3AbmpCmpfGdJzCJcOuZRVs1dxzcRr+HLPl/zk2Z8w+S+T+cuav1BeU96s9fm9fnLTc/F5fWwr3cbGvRspqSohrOEUfQJjjGmdZJNCjToN5AogItmpC2nf65HZg7lj5/L2T9/m7ul30yWtC/Nfmc+YxWP4/Wu/Z2vJ1matz+fxucnhm7Jv2LR3kyUHY0yHlGxSeEJE7gO6ichs4CVgcerC6hj8Xj8/OPIHPPfD53j2vGc57tDjuO+9+5jw4AQufu5i3tv2XrPW5/P4yEnPwef1sb1sux05GGM6nKTOKajqLSJyElCCc17hOlV9MaWRdSAiwpg+YxjTZwyFJYU8/MHD/PWTv/KPL/7BqINHMXv0bKYPmY7f609qfdEjh1A4xPay7fgqfPTK6kVuem6zzl0YY0xba7IGEhGviLykqi+q6pWq+usDKSHE69elH7+d/FtWz17NwuMXUlRVxC+W/4IJD07g7nfvZm/l3qTX5fV4yU3PJc2bxrfl37Jx70aKq4rtyMEYs880mRRUNQRUiEjXdognpXweH4FQgMpAZavvIchOy+bCkRfy2kWv8Zcf/IXB3Qdz4xs3MmbxGK55+RrW71mf9Lq8Hi85aTluctiwZwNFVUWEwqFWxWiMMc2V7H0KVcDHIvIikSuQAFT1VymJKkV6ZPYgOy2bkuoSd4883ZdOmjetxev0iIeTBp/ESYNPYt3OdTz4/oM8/snj/M+H/8PxA49n9tGzOW7AcUldihpNDqFwiB3lO9hVvoueWT3pkt4Fr8fb4hiNMSZZySaF/4u8OjURcZ+V0DOzJxWBCvZW7aWkqgSvx9vq5yXk9c7jT9/7E9ccdw2Pfvgoj3z4COc/dT5H9DyCWaNnceaRZya1jWhyCGuYneU72V2x25KDMaZdJHVWU1UfAR4D3ou8/hqZ1mlF2/MHdB3A4B6D6ZHZg6pAFeFwmKpgVavW3SurF5dPuJx3Zr3Dbd+7DZ/Hx5UvXsmYxWP4w7//wDdl3yS1Ho94yEnPIcOfwc7ynWzYu4E9lXusWckYkzJJJQURmYLzqMy7gf8GvhCRSSmMq12ledPomdWTwT0G4/f6SfemU1pdSnlNOcFwsMXrTfel8x9D/4MXLniBJ895krF9x3LnO3cy/oHx/PL5X/LRtx8ltZ5ocsj0Z7KrfBcb9m4gpKFWxWaMMYkk23z0J+BkVf0cQEQOxzlyODpVge0LHvHgEQ99u/QlGA5SXlPO7ordVAYq8Xl8ZPgyWtRNhYgwof8EJvSfwKaiTTz0wUMs/WQpT3/6NOP6jmPW6Fl877DvNdk0FE0OYQ0TDAfZsGcDPbN60jWjKz7Pfv+8JGNMO0j2onh/NCEAqOoXOP0f7bd8Hh9dM7oyqPsgDu12KLnpuZTXlFNWU0ZNqKbF6x3YbSALpi5g9ZzV/L/J/49tpduY/Y/ZHPvQsdz/3v2UVJc0uY5o8spKy2JP5R427NnArvJdduRgjGm1ZJPCahF5UESmRF6Lcc4t7PeiJ6e/k/0dDutxGAdnHwwKJVUlVAQqWnxPQZf0Lsw5eg5v/OcbLP7+Yvrk9uF3r/6OMYvHcN2K69hUtKnJdXjEQ3ZaNtlp2RRVFVlyMMa0WrJtDj8HLgF+BQjwGs65hQOK1+OlS0YXumR0oTpYTWl1qXM/gYZI86aR7ktv9jp9Hh/Th0xn+pDpfPTtRyx+fzGPfPgID33wECcfdjKzR89mfL/xjTZbiQhZaVmoKkVVReyu3E3PTKdZKdm7rI0xBpJPCj7gDlW9FZy7nIHm14D7kXRfOum+dHpk9aAyUMneyr2UVpfiEQ/pvvQWtfEPP2g4d55yJ/OPm88jHz7Cox8+ygtfvcDQ3kOZNXoWZxxxRqOJJ1Fy6JHZg24Z3Sw5GGOSkmzz0ctA7AX2mTid4h3wok04/br2Y3D3wfTK6kUwFKS0urTFd04fnHMwVx97Natmr+LmE28mEA5w+QuXM+6Bcdz21m3sqtjV6PLR5JCTlkNxdTEbizayo3wHgVCgpR/TGHOASDYpZKhqWXQkMpzVSPkDkt/rp3tmdwZ1H8SArgPI9me7J6dbUiFn+jOZOXwmr/z4FR476zHyv5PPLW/dwtjFY/nTF3/i052fNrq8iJDlzyLb79zFvWHvBnaU72jViXJjzP4t2TaOchEZrarvA4hIAVCZurA6NxEh059Jpj+T3tm9Ka8pZ0/lHkqrS/F6vGT4MprVG6qIMOnQSUw6dBLr96znwQ8e5PGPH+eFR19g4oCJzBo9ixMGndDgOqPJQVUpqS5hb+VeumV0o3tm91Z18WGM2f8kmxQuBf4mIttwHrTTBzg3ZVHtR9r65PR3e3yXm064idMzT+d93/s8tOYhLnz2QgZ1G8Ss0bM4J+8cstMSPwMpNjmU1ZRRVFVE1/Su9MjqYcnBGAMk33w0CBiFcxXSi8DnRJ7CZpKX7kunV3YvBvcYTL8u/fB7/O6d083tuqKLvwuXjL2Et3/6Nv89/b/pltGN+a/Mp2BxATe8ekOjT4eLHsnkpOVQHihn496NbC/dTnWwurUf0RjTySWbFH6rqiVAN+Ak4H7gnpRFtZ9LdHI6EAq06OS03+vnjCPP4LkfPsffz/s7kw+dzOL3FzPhwQn87LmfsXrb6gYXsN0VAAAeaUlEQVTXF00Ouem5VAQq2FS0yZKDMQe4ZJuPoruxpwL3qurfReT61IR0YImenO6W0Y2qYBXFVcXOXc0C6d70Zl1KWtCngII+BWwt2crDax7mrx//lee+eI5RB49i1uhZnDrk1AbXF+29tSJQQXFVMV0yutAzs2eL7r0wxnReySaFrZFnNJ8I/EFE0kn+KMMkoS1PTvft0pdrJ13L5eMv52/r/sYD7z/AJcsv4YacG7ho5EXMzJ9J98zuCZeNxlAZqGRT9SYEwePx4BUvHvHg8/jcbjaiwz6PDxFxyooHkcg7zg13YQ0jSIv6jTLGtK9kk8J/ANOAW1S1SEQOAa5MXVgHtrY6OR19OtyPR/yYVza+wuL3F3PTGzdx29u3cU7eOcwaPYvv9vhuwmVjn/ugqoQ1jKIEwgFUFUXd97CGQUFRp+KPtlYJVIeqWb/beQqdx+PBgwevp26C8YrXneb1eOskl0SJxpKLMamTVFJQ1Qrg6Zjx7cD2VAVlajV053RYw4TCoaQeuuMRDycOPpETB5/Ipzs/5cEPHuSJtU/w6EePcvzA45k1ehaTDp3UYGUrInilZQ/3ifbsCtRJImF1nlsRm1xUnRfRMBpINIITj4jUOVqJP5JJlEyiw9F5xpi6rL/lTiK287tAKEChp5BAKEBFoKJZ3Xof1fsobjn5Fq6ZeA3/89H/8MiaR/jh0z/k8J6HM2vULGYcNYPn1z/PojcWsa10G31y+zBv4jxmHDWj1Z8hds+/NWKTSFjDhDREdai63hGMUzi6cWc5cbKKOy/a9OURD4FwgO2l2+slmETJJD7RGLO/sKTQCfm9frziZVD3QS0+Od0zqyeXj7+cXxT8gmVfLGPxe4u56qWruH7l9dSEa9yeVreWbuWqF68CaJPE0BaiyQUBL617PGlYw7XNY6pUBavcnm+jTWaJkokTSG2iiT3vkswr+hma825Me7Ck0Im1xcnpdF865+Sdw9lHnc07W99h5tMz63W9XRmsZP4r8ympLiE7LZscf47znpZDTlqOOy0nLafTPUPaIx43uYhIi6+2ij3vEj16iT1yAeoexShOkmnGe/ScTE2ohs1Fmy35mJRIaVIQkWnAHYAXeEBVF8XNvwKYBQSBncB/qurmVMa0v2rtyWkRYXy/8Q3eo1BSXcL8V+Y3GUeGL8NJFpHEIdXCdwq/U2dafDJpKMFk+bM6TSXVmvMuyYomlGjl3ZzkoxpzbiaSZNwmttjPETnq8RBJLJEjIBFxpsVdLNBY4lGUQChgiaeTSVlSiHSvfTfOzW6FwCoRWaaq62KKfQAUqGqFiPwcuBnrPqPVGuvWO8OX0ejefJ/cPmwtrX83dJ/cPiz/4XLKasooDzid/JXVlLkd/pUFYoaj0wNl7KjZwc7ynWzcu9FdriJQkdTnEKRe4nATSBPToknFTTb+7BY/TrUpT3/6dErOwcSLbTZL1eNX48/LqCoBDbToqKcmWMPGoo2NHvVE/x7RBNOSYfd7aeFw9HNbsnKk8khhLLBeVTcAiMhS4AzATQqquiKm/NvABSmM54ATf3K6rKaMvZV7Gz05PW/iPK568Soqg7X9HWb6Mrlm4jX0zu5N7+zezYph7aq1DB0ztM60sIbdBBKbYCoCFY0mm2iiKSwprDOtKlSVVCw+j49sf3ZtMvHXPUKp2VvDgKoBdZONP6du4olZzu/18/SnT9f5vjriOZjmiE08reXxeMhJy0k47+l1T7Po37WJ9Kpjr+KMI84AcI9+gDqJKH48/nxPc4ejB0rVoWq+3P2lG7NQ/8imJUkr+r8Ve3TUmuH2Ii3p7z+pFYucDUxT1VmR8R8B41R1bgPl7wK+UdXfJ5g3B5gDcNBBBx29dOnSlMQMUFZWRk5O4h9yR9KaOFWVkIac/pak/g/v5R0v8/Cmh9lZvZPe6b25aOBFnPCdE1q0raryKjKyM1q0bLKC4SCVoUoqQ5VUhCoafa8MNlImWEFluJKQJtcPlV/8BDWYsBkmzZPGqG6jnHsv8Dr3YjTxcu/ZaOIVqg6RkZGRVNnmrNcr3jp7763V0N/+5R0vc/uXt1Mdrm2qTPekc9mQy1r8O2uNBn+jDTSx1S3SyPyYCxLaarimoobc3NxGY2rI1KlT31PVgqbKpfJIIdEvK+E3KCIXAAXA5ETzVfV+nP6WKCgo0ClTprRRiPWtXLmSVK6/rbRFnKFwyD05XR2qdk9OD5Wh/IpftUmciY4UOqq1q9aSV5BHdai6yWax6PA9qxN3AVYTrqHCV0EwHCSkIYKhIKFwyBkPhwhqsHY4WiYcbPEzv9uSV7z4PD68nsh73LhPYubFlXGniY/K0kq6de9Wb7n/2/B/dRICQHW4mns23oOnt3MpcJo3Db/Xj9/jvHxeH2meNPfdnef115aPjMe+R+c11mTaGX6jT697mpv+fRPbS7czoOsAFp6wkJn5M1OyrVQmhUKgf8x4P2BbfCERORGYD0xWVeuJrR2l4pnTnZ2IkOHLIMOXQc+snk2WX/b5soTnYPrm9uWfF/yz2duP3pQYmyii40F1hj/78DMGDR1Up0yiBBObgELhUJ3h+HmJyjc0LWFSiylTHaymPOwk0tKS0nplGjqnVFJTwk1v3NTs7ywZHvEkTiIeP+GaMNmfZpPmTauTkHye+okoOj/23e/11ynX7PLx82LKe8TjNFG+VNtEubl4M3P+MQcgJYkhlUlhFTBERAYBW4HzgB/GFhCRUcB9OM1MO1IYi2lCQyeno1eRxF65EnsDWny764F2lUlD52DmTZzXovV5xIPH62n0XpPSzFKG9BzSovW3p4b2wMcuHttgIn3totcIhAIEwoH679HhBPNrwjUEQ8G65RopH1tu967dZHbNrFO+vKY88TIx78FwkJpQTZNNTK3hEU/Co8eKQAXzX57fuZKCqgZFZC7wAs4lqQ+p6loRWQCsVtVlwB+BHJwH+ABsUdXTUxWTaVr8yemQhtwbu2LvIo42dURfoXDIOU8ROUkYxpkWDocpqymrvfIE6l+NAnWSSTSOhhJORxI9mdweVx/tLxpLpNGjtPbUmuaj6Pm5aLKIJorGkkiixFVvuXCAYChITbiGP7/z54Tb3lK8pTUfu0EpvU9BVZcDy+OmXRczfGIqt29ax+/14yf5rrvjqSrbfds5rPthdRJKfGd60elugomcBI+dVhOqIUyYcDic+ERcoitL2umoZsZRMywJNMP+lEhFBJ8451IyyWx6gRZ4at1TCY+sBnQdkJLt2R3NJmWiFW1b3+Ucn1ASJZnotPgjmtijnOhRTUhDzrIxRzXxTWYoqIYRVSQUeVeQsCKhkDMtEEAih/oKEHM3eZ2r/ERAJGGzg3rqJyenk0BnGYBwIEDlt1txM2PMtfZJrc+NIyY+Yq/Tr91WQnHz6i5bG3M4FKSsaIe7TPTGO4Cz3inlZ7eG8W2DYJ8wu9JKKe27yw0uuk4n0Ue2GdfNSOxlm7WheerEWHs/ArXjcfcpaDhMsKqi3r0LErMzkex30eIyjZS7zns8lwcepSJm/ywrAAvTpye33maypGA6nbbqWA8AVQiH0VCIbd5CDks/BA0FCQdq0EAAra5Gg8HaaZHkEY4koKCGSFv+L3LvvBfvNzsIHfwdii69mMrTvgfUbQv2RCuvmDZiT2xFEKnU4z9XbRXmzPcqdKlWPPUeaRL3nTSwPieW+tzKNSa5JKoQYythd4pSr1LbFoIBZV5nfTGVtOe5/8N33QKkyrm/xL91OwdfuYCelULo1OmgimrYeQ8FIyE5f6fYeeFwGMKKagjCkaPIyHzVsPN3VY2UDTllqV1Wws5OQtbOcrzF36BEdihCQUDqLUPYWRcKEg7VZlcNO59f1fnbRoYlHBmmdlmJmV9nWvR7j3zO6PpElf/809/JHgDzT4AtXWFAMSx8GWaWLHcekNzGLCmY/U+0AgmHIRSqHQ4EIBh03gMBZ17QqXQEoCaAd1ukR3iPx6nIPB7wZ0K6xxmO9/TTcMPNUOm0j/u2f0uv390M2b1gRmqaQ3zbiundvV/9GaEQ1NTUfsbocE1l5D3RvJqm50W/r9h5sdMaeBWUlJDh89Wft2tXncQDIFVVpF11DVx1TUq+s8b0bfctNt/Mj51XHdIJzykY02ZiK/rYyj5aQUUrsZiK3l0uugcbW9F7vZCWBhkxJzU9HmjODYFVVbBwoZsQXJWVcN11UF6eVOXZ4Cv6meKmjS8vdz5HdF60XIpuRAWc7yYtDXw+8PubfmVnU+P1Qo8edaf7fLBkScPbufzy2qay2Ff0bxc/3Ni0hpaLfp7I9HXbtpHXv3/Ty0LS62wyxvj50XXHjkfLnHsufPtt/e9qgJ1TMPuj2D356HD8Hm8w6LxiK/io6D9YQxV9MgIBKC4ma8sWqKiAvXvrvoqKEr/HJ4NYe/fCvASXpcZXrk1VtNnZ9abtLS/nkF69apdNS6utcGOnNTUvdr2NzfP7ne+2mT5eu5YpQxNc1bNyJWytf+KUvn3hsstqx6NJLjbZJRpuKBk2tXzEjo0byRs0qP6y0d9aot9dU9MSzW+obOwRaOxwdP68efCb39T9vWVlOTskKWBJwbS9+GabsrKGK/pYsSdUoxV9tBJNpqIPh6G4uPGKPNG00lLA6ayrHp8PunWD7t2d9379YNgwZ7x7d7j3Xmc98Q4+GJYvr1/xt6Byjff52rUckqiyTbVIm7171BYdjn/Fli8rq19BXn45XHutc6QVlZkJv/61s0xjlWVDFWjsnnyyy0fLFRY6CSl2WkPDLZnf1DJNuewy6N0b5s9Ht2xBBgxwEsLMzndHs9mfxFf0oZDzim3qiL5DbUUQCMC2bc2r6FWdyiRRRd7YHnxxccN7jSLQtWtt5d6rF3z3u7WVe/furCsrIy8/v7ZM9+5Oc1Jj/7x9+8JVV9Xdi8vMhPnz4aCDWvZdt4XYSrqxCjy2Ek60jth5Xm/dozKfr+54dH70b711q9PEEd9ccsUVTtKcPx+2bHHKpLCSa5LH4xyRdWQzZ8LMmbzaDt3wWFI4EMVWCLEVfbSN/vHH4fe/dyrzQw5x/om///36lUR8Re/316voPTU1UFLSdFNM/LT4o4hYubl1994HDKhbkUffY4e7dGlyL33H2rXkNXcPPHoyedEi5/vq08c53G/uSeZElXd0HOoPl5Y2XpnHVtDxFXjscPTVUFt37HhziTSc+COVnOl4LCnsDxqq4KMnXWNfiU7EQu0//XPPOXtw0UP7bdvgt791KpYpU5puiombNqmqkW6tMzLqVt6HH163Qo+v2Lt1c17+lt9Q12ZiK+7vfx9OPbVuhV5enviopaG25tg97kR739HKXMRp7ujfv+kTm8a0gCWFjijRVTbRvfjoKxCAjRtr58eKb5uP3aP3+51l9uyprcSjw3v2wP33123rBadp5PLLG47X769beR96KIwYAd27s6G6msFHHpm4cs9MzR2gDWqoSSX6/UXbwBtaNraija/Efb7aPfD4ppTGrjyJvXolWR6Pc6LRmBSwpJBq8ZdSxrbHN7UXH10e6lfw0SaCykpnzzy2Yk9U2Uf33vfscU74tsSNNybek8/KarBi27J2LYNbe1I0thJP1D4enxSjyySKKbq3HdukEvt+yCENV9yJLiM0Zj9jSaG54iv4hpppopV8YxVWbJtuopOrjVTyx+zc6ZRvqO3d46mttHv0cNrdR46sOy32vXt350TsMcc0fLngT36S/PcUW2kHAg1X6PHfSUOfJXaPPHY4do89mcq8MV6vc77CmAPYgZ0UEu3FR0/ixV5V09BefKzYSj4Uck6uFhXV3YuP33uPndbYlTN+f93Ke8gQdg0ZQp/DDmu4ku/SJfEduE2ZN6/+1TQZGfBf/5W4nbypNvLY4fg989iTnI01rxhj2s2BkRSWLKm9/K1PH+d66NNOS7wXHwjA9u21FVMgULeCT1SxxzffRK57Tyh6cjVaefft2/jee48ezuVycRXvF2vX0qepZpn4ZJdMc8vJJzuf+U9/qr2a5tpr4Zxz6p7sTLZ5ZcsW56SoMaZT2P+TwpIlMGeOc6cqOE0j8+bBl1/C0KH1KvnhX3/tVIrRaRWJnxIFONewx1bigwbVrdATVfYtObkaf8I5WrEnOikau+cebWqJ3tEaf0I0fk89+jr88MZPLBtj9lv7f1KYP79+xV5dDf/933WnRW5s8mVkOHvvRxxRf4899r1bN0hv5uMqo1cQNWfPHepX7tGTpIcckvh689imG2OMaYb9Pyls2ZJ4ugisWOFU8l27OpUs8H5D/bXEilbqNTX1r4qJF3v1UKLKPf7GomQrdzspaoxJgf0/KQwYAJs315/epw8cdlhtBV9V1XSzDDS/co+t4I0xpoPb/5PCwoV1zymAc7L38sudPf1km2WscjfGHAD2/6QQ7V8levVR//5OorjggsTlrVnGGHMA2/+TAljnW8YYkyRrCzHGGOOypGCMMcZlScEYY4zLkoIxxhiXJQVjjDEuSwrGGGNclhSMMca4LCkYY4xxWVIwxhjjsqRgjDHGZUnBGGOMy5KCMcYYlyUFY4wxrpQmBRGZJiKfi8h6EZmXYP4kEXlfRIIicnYqYzHGGNO0lCUFEfECdwOnAHnA+SKSF1dsC3Ah8NdUxWGMMSZ5qXyewlhgvapuABCRpcAZwLpoAVXdFJmX4Mn1xhhj2ptooofNt8WKneagaao6KzL+I2Ccqs5NUPYvwHOq+mQD65oDzAE46KCDjl66dGlKYgYoKysjJycnZetvKxZn2+sssVqcbauzxAmti3Xq1KnvqWpBU+VSeaQgCaa1KAOp6v3A/QAFBQU6ZcqUVoTVuJUrV5LK9bcVi7PtdZZYLc621VnihPaJNZUnmguB/jHj/YBtKdyeMcaYVkplUlgFDBGRQSKSBpwHLEvh9owxxrRSypKCqgaBucALwKfAE6q6VkQWiMjpACIyRkQKgXOA+0RkbariMcYY07RUnlNAVZcDy+OmXRczvAqnWckYY0wHYHc0G2OMcVlSMMYY47KkYIwxxmVJwRhjjMuSgjHGGJclBWOMMS5LCsYYY1yWFIwxxrgsKRhjjHFZUjDGGOOypGCMMcZlScEYY4zLkoIxxhiXJQVjjDEuSwrGGGNclhSMMca4LCkYY4xxWVIwxhjjsqRgjDHGZUnBGGOMy5KCMcYYlyUFY4wxLksKxhhjXJYUjDHGuCwpGGOMcVlSMMYY47KkYIwxxmVJwRhjjMuSgjHGGJclBWOMMS5LCsYYY1yWFIwxxrgsKRhjjHFZUjDGGOOypGCMMcaV0qQgItNE5HMRWS8i8xLMTxeRxyPz3xGRgamMxxhjTONSlhRExAvcDZwC5AHni0heXLGfAntV9bvAbcAfUhWPMcaYpqXySGEssF5VN6hqDbAUOCOuzBnAI5HhJ4ETRERSGJMxxphG+FK47r7A1zHjhcC4hsqoalBEioGewK7YQiIyB5gTGS0Tkc9TErGjV/z2OyiLs+11llgtzrbVWeKE1sV6aDKFUpkUEu3xawvKoKr3A/e3RVBNEZHVqlrQHttqDYuz7XWWWC3OttVZ4oT2iTWVzUeFQP+Y8X7AtobKiIgP6ArsSWFMxhhjGpHKpLAKGCIig0QkDTgPWBZXZhnwk8jw2cArqlrvSMEYY0z7SFnzUeQcwVzgBcALPKSqa0VkAbBaVZcBDwKPish6nCOE81IVTzO0SzNVG7A4215nidXibFudJU5oh1jFdsyNMcZE2R3NxhhjXJYUjDHGuA6opCAiD4nIDhH5JGZaDxF5UUS+jLx3j0wXEflzpAuOj0RkdDvG2V9EVojIpyKyVkQu7cCxZojIuyLyYSTW30WmD4p0XfJlpCuTtMj0fdq1iYh4ReQDEXmuo8YpIptE5GMRWSMiqyPTOuLfvpuIPCkin0V+qxM6aJxHRL7L6KtERC7roLFeHvk/+kREHov8f7Xvb1RVD5gXMAkYDXwSM+1mYF5keB7wh8jwdOB5nHspxgPvtGOchwCjI8O5wBc4XYV0xFgFyIkM+4F3IjE8AZwXmX4v8PPI8C+AeyPD5wGPt/Nv4Argr8BzkfEOFyewCegVN60j/u0fAWZFhtOAbh0xzriYvcA3ODdydahYcW7m3Qhkxvw2L2zv32i7/1H29QsYSN2k8DlwSGT4EODzyPB9wPmJyu2DmP8OnNTRYwWygPdx7lzfBfgi0ycAL0SGXwAmRIZ9kXLSTvH1A14Gjgeei/zTd8Q4N1E/KXSovz3QJVKBSUeOM0HcJwP/7oixUtvDQ4/Ib+454Hvt/Rs9oJqPGnCQqm4HiLx/JzI9UTcdfds5NiKHhKNw9sA7ZKyRJpk1wA7gReAroEhVgwniqdO1CRDt2qQ93A5cBYQj4z07aJwK/EtE3hOnixfoeH/7wcBO4OFIc9wDIpLdAeOMdx7wWGS4Q8WqqluBW4AtwHac39x7tPNv1JJCw5LqgiOlAYjkAE8Bl6lqSWNFE0xrt1hVNaSqI3H2xMcCRzUSzz6JVUROA3ao6nuxkxuJZV9+p8eq6micHoYvEZFJjZTdV3H6cJpi71HVUUA5ThNMQzrC/1MacDrwt6aKJpjWHr/R7jidhA4C+gDZOL+BhmJJSZyWFOBbETkEIPK+IzI9mW46UkZE/DgJYYmqPt2RY41S1SJgJU47bDdxui6Jj2dfdW1yLHC6iGzC6bH3eJwjh44WJ6q6LfK+A3gGJ9F2tL99IVCoqu9Exp/ESRIdLc5YpwDvq+q3kfGOFuuJwEZV3amqAeBp4Bja+TdqSaFuVxs/wWm/j07/ceRKhPFAcfRQM9VERHDu9v5UVW/t4LH2FpFukeFMnB/2p8AKnK5LEsXa7l2bqOo1qtpPVQfiNCG8oqozO1qcIpItIrnRYZw28E/oYH97Vf0G+FpEjohMOgFY19HijHM+tU1H0Zg6UqxbgPEikhWpA6Lfafv+Rtv7RM++fOH8ILYDAZws+1OcNriXgS8j7z0iZQXnIUFfAR8DBe0Y50Scw8CPgDWR1/QOGutw4INIrJ8A10WmDwbeBdbjHK6nR6ZnRMbXR+YP3ge/gynUXn3UoeKMxPNh5LUWmB+Z3hH/9iOB1ZG//bNA944YZ2T7WcBuoGvMtA4XK/A74LPI/9KjQHp7/0atmwtjjDEuaz4yxhjjsqRgjDHGZUnBGGOMy5KCMcYYlyUFY4wxLksKpkMTkZ4xvVt+IyJbY8bTklzHwzHX0zdU5hIRmdk2UXcMIvKGiIzc13GYzsUuSTWdhohcD5Sp6i1x0wXntxxOuOABSkTeAOaq6pp9HYvpPOxIwXRKIvLdSJ/z9+L0zHqIiNwvIqsj/dFfF1P2DREZKSI+ESkSkUXiPP/hLRH5TqTM70Xkspjyi8R5TsTnInJMZHq2iDwVWfaxyLbq7YmLyBgReTXSod3zInKQiPgj4xMjZf4otc+e+J2IrIp+nkiSi8Zxq4i8LiLrRKRARJ4Rp1/962O+h7Ui8qg4z2B4InJneXxMp0Q+7/vi9MGf3cZ/ErOfsKRgOrM84EFVHaVOD5PzVLUAGAGcJCJ5CZbpCryqqiOAt4D/bGDdoqpjgSuBaIL5JfBNZNlFOL3X1l1IJB24AzhLVY8G/he4QZ2+bC4C7heRk3H6Xvp9ZLE7VHUMkB+Jb1rMKitV9Ticbk+eBS6OlJsT7V4k8j3crar5QBXws7iYvoPTWd0J6nS09xFwaQOf2xzgfE0XMabD+kpVV8WMny8iP8X5XffBqSzXxS1TqarPR4bfA45rYN1Px5QZGBmeCPwBQFU/FJG1CZY7ChgKvBTZ4ffidKmCqn4kIktx+q4ZF0kUACeIyJU43Rb0imwzGuOyyPvHwMca6cxNnI79+uEkgY2q+nak3P8Cc3A6+4s6JvJdvBmJKQ14o4HPbQ5wlhRMZ1YeHRCRITh7v2NVtUhE/henko1XEzMcouH/geoEZRJ1VRxPgI8ie/eJDMPp9z7abJUF3IXzpL2tIvL7uLijcYRjhqPj0bjiTwzGjwvwT1X9URLxmwOcNR+Z/UUXoBQoEacb5O+lYBtvAP8BICL5OHvf8dYBfUVkbKRcmogMjQyfC+TgdMh3t4h0ATJxKvhdkd5Rz2pBXINEZExk+HzqHwW8CUwWkcGROLIjSdSYeiwpmP3F+zgV8ifAYuDfKdjGnTgV/kfAf0W2VRxbQFWrcboxvlVEPsTpQXZcpF3/98BsVf0M55GPt6nqbpxnHX+C8+yEd2i+tcDsSFzZwP1xMX2L0yPw45GY3gQOb8F2zAHALkk1JkniPMjEp6pVkT3tfwFDtPZRifsipu8CT6rz5DtjWs3OKRiTvBzg5UhyEOBn+zIhGJMKdqRgjDHGZecUjDHGuCwpGGOMcVlSMMYY47KkYIwxxmVJwRhjjOv/AyJzkam8lOtAAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curve(LinearRegression(), 'Liner_model', train_X[:1000], train_y_ln[:1000], ylim=(0.0, 0.5), cv=5, n_jobs=1)  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.4.3 多种模型对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "train = sample_feature[continuous_feature_names + ['price']].dropna()\n",
    "\n",
    "train_X = train[continuous_feature_names]\n",
    "train_y = train['price']\n",
    "train_y_ln = np.log(train_y + 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.4.3 - 1 线性模型 & 嵌入式特征选择"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "本章节默认，学习者已经了解关于过拟合、模型复杂度、正则化等概念。否则请寻找相关资料或参考如下连接：\n",
    "\n",
    "  - 用简单易懂的语言描述「过拟合 overfitting」？ https://www.zhihu.com/question/32246256/answer/55320482\n",
    "  - 模型复杂度与模型的泛化能力 http://yangyingming.com/article/434/\n",
    "  - 正则化的直观理解 https://blog.csdn.net/jinping_shi/article/details/52433975"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在过滤式和包裹式特征选择方法中，特征选择过程与学习器训练过程有明显的分别。而嵌入式特征选择在学习器训练过程中自动地进行特征选择。嵌入式选择最常用的是L1正则化与L2正则化。在对线性回归模型加入两种正则化方法后，他们分别变成了岭回归与Lasso回归。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.linear_model import Ridge\n",
    "from sklearn.linear_model import Lasso"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "models = [LinearRegression(),\n",
    "          Ridge(),\n",
    "          Lasso()]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LinearRegression is finished\n",
      "Ridge is finished\n",
      "Lasso is finished\n"
     ]
    }
   ],
   "source": [
    "result = dict()\n",
    "for model in models:\n",
    "    model_name = str(model).split('(')[0]\n",
    "    scores = cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error))\n",
    "    result[model_name] = scores\n",
    "    print(model_name + ' is finished')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对三种方法的效果对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>LinearRegression</th>\n",
       "      <th>Ridge</th>\n",
       "      <th>Lasso</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>cv1</th>\n",
       "      <td>0.191642</td>\n",
       "      <td>0.195665</td>\n",
       "      <td>0.382708</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cv2</th>\n",
       "      <td>0.194986</td>\n",
       "      <td>0.198841</td>\n",
       "      <td>0.383916</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cv3</th>\n",
       "      <td>0.192737</td>\n",
       "      <td>0.196629</td>\n",
       "      <td>0.380754</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cv4</th>\n",
       "      <td>0.195329</td>\n",
       "      <td>0.199255</td>\n",
       "      <td>0.385683</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cv5</th>\n",
       "      <td>0.194450</td>\n",
       "      <td>0.198173</td>\n",
       "      <td>0.383555</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     LinearRegression     Ridge     Lasso\n",
       "cv1          0.191642  0.195665  0.382708\n",
       "cv2          0.194986  0.198841  0.383916\n",
       "cv3          0.192737  0.196629  0.380754\n",
       "cv4          0.195329  0.199255  0.385683\n",
       "cv5          0.194450  0.198173  0.383555"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result = pd.DataFrame(result)\n",
    "result.index = ['cv' + str(x) for x in range(1, 6)]\n",
    "result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "intercept:23.515984499017883\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1feb933ca58>"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = LinearRegression().fit(train_X, train_y_ln)\n",
    "print('intercept:'+ str(model.intercept_))\n",
    "sns.barplot(abs(model.coef_), continuous_feature_names)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "L2正则化在拟合过程中通常都倾向于让权值尽可能小，最后构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单，能适应不同的数据集，也在一定程度上避免了过拟合现象。可以设想一下对于一个线性回归方程，若参数很大，那么只要数据偏移一点点，就会对结果造成很大的影响；但如果参数足够小，数据偏移得多一点也不会对结果造成什么影响，专业一点的说法是『抗扰动能力强』"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "intercept:5.901527844424091\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1fea9056860>"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdAAAAD8CAYAAADHRPX5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XnclFX9//HX231BBRSXNEQBMxdEvd2X3L6m5ZqWlVmoaWmLZlr2tW/5yzazrNxFMyz3XdRyzV1BQRDEDRRLwwwVUNzFz++PcwYuhpl75r65Z+YG3s/H434wc825rutcA3ruc87nfI4iAjMzM+uYxVpdATMzswWRG1AzM7NOcANqZmbWCW5AzczMOsENqJmZWSe4ATUzM+sEN6BmZmad4AbUzMysE9yAmpmZdcISra6ANc4qq6wS/fr1a3U1zMwWKKNHj341IvrUKucGdCHWr18/Ro0a1epqmJktUCT9s55yHsJtAEn9JD0l6QJJEyTdLmlZSUdIelTS45KulbRcLj9M0rmS7pb0vKRPSbooX2NY4bq7S3pY0mOSrpbUo2UPaWa2iHMD2jgDgbMjYkNgOnAAcF1EbBERmwBPAYcXyvcCdgG+B9wE/B7YENhY0mBJqwA/BnaLiM2AUcBx5TeVdKSkUZJGTZ06tYGPZ2a2aPMQbuNMjoix+fVooB+wkaSfAz2BHsBthfI3RURIGg+8EhHjASRNyOeuBWwAPCgJYCng4fKbRsRQYChAW1ubt9oxM2sQN6CN817h9SxgWWAYsF9EPC5pCLBThfIflZ37EenvaRZwR0R8qUH1NTOzDljkh3DzfOUTnTx3J0k3t/P5SZLGkoZlfwJ8HLhU0rHAwR283QhgO0kD8rWXk7ReZ+ptZmbzb5FvQBspIn4REYNJ85kfAt8Blgf2A57u4LWmAkOAyyWNIzWo67d3zodT/9uJWpuZWT3cgCZLSLpY0jhJ1+Te3a6SxkganyNilwaQtIekpyU9AHwuH1tM0kRJpXVD/wKWyYE/RMRvgfcj4tyIWIfUgH4W+HoufyxwmqTFgUuAO3O07XjgrIi4JkfcfhUI0nDuSRExvBlfjpmZzcsNaPIJYGhEDALeIEW3DgMOioiNSXOQR0laBrgA2BvYAVgdICI+IjV8pWHZ3YDHI+LVSjeLiOnAg8Ae+dCXgasiYlZ+v3REbAMcA1yYj/0EuDUitiRF6/4u18fMzFrADWjyYkQ8mF9fAuxKiqJ9Nh+7GNiRNGQ6OSImRkTksiUXkXqIAIcBf65xzwuBQ/PrQ8vKXw4QEf8AVs29z92B0pzq3cAyQN/yixaXsbw2c2aNKpiZWWe5AU06styjYtmIeBF4RdIuwFbA39u9SMS9wHqSdgY+iIjinGj5PQIQKYJ3cP7pW2jgi9cdGhFtEdG2cg/nWTAzaxQ3oElfSdvk118C7iSt2Zwk6VLgEOBeUuDPOpL6F8oWXUjqlfYGVpE0Nv/8B1iu8H6pXP4S4FLm7a0eBCnKl7Qm9C3SmtHvlgpI2rTWQy3RZ9U6Ht3MzDrDDWjyFPC1HN3amxQ1O5O0HnMQaS3meRHxLnAkcEsOIirPlziclCBhJjCr1FsEziP1Mku9x/dz+UuBlYAry67zhqSHgDOBI/Kx/0dqhMfn5Aon13qoD6ZO4eVz/q/uL8HMzOq3yCdSiIgXSBl+ZpN0HilAaAZpnvHiiCglN/gtsEdEvCDpK8AueV5yJPAn4HHSes9yJxWu/yvgJeA14CrS3OY/gWeBjYAPSNmK7iZlMYI0B1v6bCJpntXMzFrEPdAKIuKbwBRgZ1JvdB6SPkkaat0u9zIHAX8DflTHLS4EfgqcAvwS+Dw5cAhYATgN2Bj4JLCvpFWBE4Fdcx7ccaQIXTMza5FFvgc6H3YFNgcezblplyWt2Xwgv68qIp7L2Y+OIS2heSQipuXz7o2IvwFIugLYPp+2AfBQIQ/uA5WuLelI0jAza/ZecX6ez8zM2uEGtLYPmbunXlp7KdLQbj09zkr+RMos1A84v3C8WgTurRFxSK2LFpPJb7L2x5xM3sysQTyEW9sLwGYAkjYD1snH7wIOzMOrSOotae0OXHc50jzmYFLUb8nWkvrmrERfIPU0HwI+JWndfK/lJQ2sdYMl+3yMNY4+pQNVMjOzerkBre1aoHcOFDqKFOhDRDxJ2p/z9hy9ewewRj0XlLQEKRhoCnB5zmRU8hDwO2B8vtfwiHiFtHfolZIez2WcSN7MrIXcgFYREf0i4tWIeAe4nzR02w8YS+p59idlEJpFitY9OCJGSNobeAW4Q9KdklaLiJOBHpKGSrod+AtpWHYtYAdJz0j6ab71W6R9Pj8iRd6WgoWmA0uTkjRsC/xG0kbtPcP7/53EP8/Yryu+DjMzK+M50BoktQEHAJuSvq/HSEtLhgLfjIiJkrYCziHlqH0A2Dpvjv114AfA9/PlNicFBQ0A/gEsTkpI/zbwKDCVtC70UFJDKWCkpHsj4lFJw4GfkwKWLomITm3DZmZm888NaG3bAzfmniiSbiL1RrcFri5E3C6d/1yLNNS6BiladnLhWsPzdcZLOgHYJSJey9e9Lpe/AVg5Zx8qHd8BGAP8jNTQvkshK1HRXFG4vZad74c3M7PKPIRbW6U1KYsB0wuZhQZHxCfzZ2eSlrNsDHyDOVG7kIZni6pF3FbTm5TpaIWy6865QCEXbu8eS1UqYmZmXcANaG0PAHtLWibvivJZ0pDrZEmfB1CySS6/EvDv/PprNa79Pzl6d1nSHqEPAvcB++U9SZcH9ifNwUIaNv4/UgrAU7vm8czMrDM8hFtDYe7xcVLu21HkoCHgXEk/BpYErshlTiYN7f4bGMGcZS+VPAD8lTQnellEjAKQNAx4JJe5MCLGSPoq8GFEXJaXuDwkaZe85VlFS606gLW/e0Mnn9zMzNqjtK2ltUdSj4iYKWk5Ug/xyIh4rBvUa4mI+LDa521tbTFq1KhmVsnMbIEnaXREtNUq5yHc+gzN60AfA66t1HhK6ifpaUkXSxon6Zo8DLurpDF5F5WLJC0tacscHISkfSW9I2mpPEz8fD7eX9KtkkZLul/S+vn4MEmnS7obD+OambWMh3DrEBFfrrPoJ4DDI+JBSRcBx5ECiXaNiGcl/YWUjOEs0rIYSBG2TwBbkP4+Rubj1ZbJQEqisFtEzCqvQDEKt2/fvh17UDMzq5t7oF3rxYh4ML++hJRwfnJEPJuPXQzsmIddJ+UdXbYETiclTdgBuD8HK5WWyYwl5cotZjm6ulLjCXNH4fbp06ern8/MzDL3QLtWRyaU7wf2JKX0uxMYRkqscDyFZTJVzi1fDmNmZk3mHmiW5zCfKDvWJumM/HqIpLNqXKavpG3y6y+RGsZ+kgbkY4cA9+bX9wHHAg9HxFRgZVJv9PmIeIPqy2TMzKwbcAPajogYFREVM/5U8RTwtZxcvjdpM+5DSUOx40n5bc/LZUcCq5EaUkibZC9D2qUF0jKZw3Py+AnAvpVumJe0VDTz1Uncf8Fe3H/BXh14BDMzq4cb0AokrZsjZ0+QdHOFz9eWdFeOtr1LUilaZw3SMO5rpCChLUgN4TLA6Ig4LCLek7Q7KRfuBOCIPOf5BGlI/W5Jd0fEZNLc6Nuk1H0b5+U0Q4DfSvqJpAeAzzfwqzAzsyrcgJaR9AnSFmaHkvLOVnIW8JeIGETKCnRG4bNepGjZ7wE3kXqhG5IawMGSViFtg7ZbRGxGSsxwXEScQdrebOeI2LlaucJ93o2I7SPiii55cDMz6xAHEc2tD3AjcEBETJC0U5Vy25B2UYGUSeg3EfGCpBuBO/JOLOOBVyJiPICkCaTt0NYCNgAezInolyJtX1Zu6xrlrqxUseIyltV6O5m8mVmjuAGd2wzgRWA70vBqvYrRt+/lPz8qvC69X4K0f+gdEfGlGtdUjXIVI3EjYihpDSnr9+vpNFNmZg3SsAZU0hDg9oiYkt/fQ5ojfBd4HzgiIsZ28T33ATaIiF938hLvk7YlO1rSTNIc5HK5N9kbmCJpaeAh4Iuk3ufBpJy29RoBnC1pQERMyukB18prRd8k7bTyao1ydemxygB2OGKeKVwzM+sCjeyBDiEFxkwpHDs4IkZJOhQ4DfifrrxhRAwHhpcfr5UztsxHpOUlp5F6gQ9HxKclfYO0MfZQ0l6cF+U9PaeS5kvrrePU/MvF5bkxhjTX+Wy+9t8lvZznQauVq8sbr07k1j99pt7ii5w9Dv9bq6tgZguwuoOI8jrJpyRdIGmCpNslLZsDY0bkiNTrJfWSdCDQBlwqaWzerqvoYWDNwrV3l/SwpMckXZ2jUpH0gqRTJT2Sfwbk43tLGpkjZe+UtFo+PnutZnnOWEnL51y0j+bz9s3llpV0BanhnQAsC8yMiC2Ad0g9TCLi/PxM+wFvAPuQGs9ewC2S9s0RsqMkPU1q7JB0qaTdgIHAryRtmXdQ+RYwkzSke6KkT0TEmcBmwNS8FOYbpAb9sByw9K6kh4HXSTvB9Kj378/MzLpWR6NwBwJnR8SGwHTgAOAvwA/z/+DHAz+NiGtIUaMH582m3ym7zh7ADQB1RJu+ERFbkiJf/5CPPQBsHRGbkrYR+0GV+pZyxn4fOAn4R24YdwZOU9pv8yjg7Vz/XwCbV3v4UoKD/D28C+yf67wz8DvlaB/S9mR/BAYB6wNfBrYnZRn631zmaVJav02BnwC/zMePBqbl+pxSqk8d35OZmTVRR4dwJxfmLUcD/YGeEVHKrnMxcHU751+aG63FST0tqB1tennhz9/n12sBV0paI5efXOV+xZyxuwP7SDo+v18G6EvKQXsGQESMyz2/9qjw5y8l7UjqJa5JSowA6XsqRt/eVYjM7ZfLrARcLGkgKQhpyXx8e1LjS0Q8UahPre+JfL/ZUbir9l6mxqOYmVlndbQBLUaVzgJ6dvD8g0mbTv8aOJu0FKRWtGlUeH0mcHpEDM9LTU6ucm4xUlWk5SnPFAvkxqiuaFVJK5AawGfzs/QBNo+IDyS9QGqUYd7o22Jkbuk7PwW4OyL2l9QPuKdQz4q3p47o3WIU7nr9VnIUrplZg8xvENEMYJqkHSLifubO9VqKKJ1Lbmx+DDyntBtJrWjTg0gN7kHM6XGtBPw7v/5anXW9DfiOpO/k3uCmETGGlErvYFIGoI1Iw67zyPON5wA3RMQ0SSsB/83PszOwdp31KFkJ+LekYeT0fTlS+XHgC7k+GwAb5/IdjspdcZWBDpQxM2uQrojC/RpwXv4f+vPMiUgdlo+/Q0o8MFtEvCPpd8DxEXF4jWjTpSWNJM3XlnpfJ5Pyy/6b1LCsU0c9TyHNoY7Lc5UvAHsB5wJ/zkOlY4FHys67O5dfDLg+XwdSBqKbJI3K5z1dRx2KfkMa8l6JtDNLydXAsbk+Y0g5cmdUid79CR2IyjUzs66jiO47ypeHRdsi4tVW16Uj8jzvVaS52sVJje4k0rrSHqR1nkMi4uXcA705Iq7JPdAfkBrNHUk97w1JKQGHRMTM/J1cRJrTPau9VH5tbW0xatSohjyjmdnCStLoiGirVc6ZiBpjD2BKRHwWIA/3/h3YN/ckDyJF/B5W4dxlSL3qAaTgqP1Iw8rHAT/LZd6NiO0b+whmZtaebt2ARkS/Vtehk8aTdkw5FbgZmAZsBNyRg5YWB16ucu7bpCHsYaRArV9RZx5cmDsKt2/fvtWKmZnZfOrWDeiCKiKelbQ58BlSA3gHMCEitmn/zNk6lQc333t2FG5bW1v3HZ83M1vAeTuzBpD0MVJyhkuA3wJbAX0kbZM/X1LShu1cYgSwXSHz0nKS1mt0vc3MrH5uQNsh6bs5feGlkpbOaQPH5jnM9mwMPCLpZeAyUsKJdUhDuO8A/wK2rXZyREwl5RK+PEfjjiBlNDIzs27CQ7jtOxrYMyImS9oaWDIiBtc6KSJuA25TIYm9pJkRMU/u2pw/t/R6p8LrfwBbVCjfrxPPYWZmXcw90EzScZKeyD/HSjoPWBcYLumHwCXA4NwD7S9pc0n3Shot6bacVhBJ90j6paR7gWOq3KunpOclLVF4P1nS4pIekPQHpeT64yW15TI9lBLkP6KUDH/vpnwxZmZWkXugQA74OZQ0VylgJPAV0nKUnSPi1ZzM4fiI2EvSkqS9QKstS+kZEZ+qdr+ImC7pwXz9m0nJ5q+KiFk5SnfpiNhG0i7AhcBgUtKEWyNiiKRewEhJd0TEu2XP4ihcM7MmcAOabA9cHxFvAUi6DtihnfKfoP1lKVWXmRRcSNpX9GZS431I4bPLIQ3jSlo1pxHcHdhT0om5TCkZ/lyZiByFa2bWHG5Ak2oJ3Nsr396ylKrLTEoi4l5JZ+U8uh9ERDEVYHnDF/me+0XEcx2sq5mZNYDnQJP7gP3ycpHlgf2ZOz9tuWfo2LKUai4h5dT9c9nxg/J1dwJeyT3j20g9VvJnm3bifmZm1kXcAwUi4rGck7aUSP7CiBgjVe6YRsT7kg4Ezshp+pYgJaqf0MFbX0qa2ywf8n1D0kOk3WxKyfknkrIbfROYStqPdd/2Lj719Ymcc8mn667M0V+5re6yZmaLOjegWUScTkr2XjzWr/D6Hubs2UneWHzHCtfZqcr151nCQpp7vSoi3ig7flVE/G/pjaTewI9Ia0mD1HgOqf40ZmbWaB7CbRFJ55L2F51cOHYy8LEKxT9NSu33ekRMI6UG3KPKdY+UNErSqJlvvN/1FTczM8ANaMtExFHArvmn5AvATrl3W7Qm8GLh/Uv5WKXrDo2Itoho67HiUl1ZZTMzK/AQbgvledZVc+7cPsC0iPhXhaKVJmO9RMXMrIXcgLbeNcCBwOpAtc2xXwJ2Krxfi8J8bDV9eg90YJCZWYMowh2ZVsrLXy4AVgE+FRHz7BOag4heAj4gJZZfD9g8Il5v79prrbtSfOeXW9dVjx9+0Q2tmRmApNER0VarnOdAWywiJpCWq/y7UuOZy7wOnE1K0LA98LNajaeZmTWWh3BbSNKpwD8jYuP8/mTgzYj4XXnZiDhB0i2kfLzliRfMzKzJ3ANtrSvIWYeyLwBXz88Fi8tY3nrTy1jMzBrFPdAWqhCF+x5p+7RisfciYqsOXHN2Mvm11l3JE9xmZg3iBrT1ilG4F0XEmV114dV7D3RwkJlZg7gBbb0rKEThViogaTBwLqmRXVnSQRFRc8u0l6ZN5AfXVExY1Cm/OfDWLruWmdmCznOgLVZPFC7wNumXnR7AksBlkj7XpCqamVkF7oG2UL1RuBHxLLBF4bzHgfFNrKqZmZVxD7S1OhyFK2lLYCmg4sbaxSjcd5xM3sysYdwDbaGORuFKWgP4K/C1iPioyjVnR+Gu3t9RuGZmjeJUfi0m6RTSBtmrAy9Xi8KVtCIp/+2vIqKutaJtbW0xatSorqqqmdkiod5Ufu6Btl49UbgDgMeAN4GTJa0cEec1r4pmZlbODWiLRcQESbWicLcDlgWeJ81bnyHpuYi4o71rT5o+kf1u7LplLPPjhn29BMbMFi5uQFuoA1G4FwMX5zIrA2OACc2trZmZFTkKt7XqjsKV9HFJ44AXgVMjYkqVcrOjcN93FK6ZWcO4B9pCHYnCjYgXgUG57A2SromIVypcc3YUbs8BjsI1M2sUN6Ct16FcuBExRdIEYId8rpmZtYAb0NarJwp3LeA1Uhq/p0kBRafXuvCAngMdvGNm1iBuQFuszijcTwK/A9Yg/Z2NjYiaqfwmTn+RPW84tusqW8Xf9/tDw+9hZtbduAFtoQ5E4d4h6VDgBOBWoOYCXzMzayxH4bZWXVG4khYj9UBPqHXBuaNw3+myipqZ2dzcA22heqNwSflv/xYRL5Z9Vumas6NwVxqwmqNwzcwaxA1o69WMwpV0KbCDpKNJe4IuJWlmRJzY3KqamVmJk8m3mKQNKUThthNIVCo/BGiLiG/XuraTyZuZdZyTyS8g6ozCRdIs0ibavYFZQM0GdOL0l/nM9T/vsroW/W3/HzfkumZmCwo3oN1AKQq3hnciYnDDK2NmZnVxFG4LSTo1z2uW3p8s6fvzec1CFO5b819JMzOryA1oa5UvYzkEOEzS2MLPyPzZMrlhHCFpv2oXjIihEdEWEW1Lrbh8I+tuZrZI8xBuC1VYxvKfiNiuSvG+OQ/uusA/JI2PiOeaV1szMytyA9p6xWUsV1QrVNq+LCKel3QPsCnQbgM6sOcaDvYxM2sQN6CtV08y+V7AysA5QD9gbeCSWheeOP0VPnud89SadZVbPtf43NK24PAcaItFxASgnmTyY4H+pMxE3wMeak4NzcysEvdAW6jeZPLAdNIOLNs3uYpmZlaFe6CtVVcyeWA9YLqk6ySNkXSapMUrXXCuZSwzvIzFzKxR3ANtoQ4kkz8N2IEUOPQv4EpgCPCnCtcsJJP/uPM0mpk1iBvQ1qsnmfzWwJiIeD6/vwHYmgoNaNHAnqs56MHMrEHcgLZezShcYHlgK0njSXlwN6JG4wkwcdpUPnvt0K6qp3WxWw44stVVMLP54DnQFqsnCjci7gL2AQJYitSI/qBplTQzs3m4B9pCHYjCJSLuAAZJOpK07dmMplbWzMzm4h5oa9UbhVv0ReDyah/OnUx+ZhdU0czMKnEPtIXqjcKNiK0AJK0BbAzc1s4150Th9l/bUbhmZg3iBrT1akbhFnwBuD4iPqjnwgN79XGgiplZg7gBbb16onCR9Bvg28BUSWcAx0SEe5hmZi3iBrTFImKCpHajcCVtC+wCTCPlw72f1Nje0961J017jb2u/UvXVtjMrJu7+YCvNuU+bkBbqANRuAEIGEBaxrIk8EoTq2pmZmUchdtadUXhRsTDwN3Ay/nntoh4qtIF547CfbMBVTYzM3APtKU6kAv3YNKWZmvlY3dI2jEi7qtwzdlRuD37r+M5UjOzBnED2nr15MI9ARgRETPz+7+TcuHO04CamVlzuAFtvXqicP8FHCHpV6S50E8Bf6h14QG9Vm7aZLqZ2aLGDWiL1ROFS+ql/ggopRa6MyJuqnXtSdOmsdc1V3ZRTc2sGW4+8KDahaxbcBBRNxARG0fEzu0U2QOYCvQAVgZWl7RiUypnZmYVuQFtIUmnSjq68P5kSd+vUHQD4N6I+DAi3gIeJzWqla5ZiMJ9ozEVNzMzN6AtVr6M5RDgMEljCz8jSQ3mnpKWk7QKsDPw8UoXjIihEdEWEW1LrehOqplZo3gOtIUqLGP5T0RsV6mspC2Ah0hDuQ8DHzavpmZmVs4NaOsVl7FcUa1QRPwC+AWApMuAibUuPKBXLwckmJk1iBvQ1ptrGYukW0lrPB+IiL0AJC0ODALOIzW0PYHDa1140rTp7H3NjY2qd6fcdOC+ra6CmVmX8Bxoi0XEBKC4jOU00lxo0ZKkxPFrklL53Q4MaV4tzcysnBvQJqgVbVtcxhIRdwHlSWzfAz4A+kXE1sDpwH6Nr7mZmVXjBrQ56koa346VgekRUQoceonUG52Hl7GYmTWH50CboEK07bSI+Fd5OUkbA38lJUzoI2ksqfe5V6XLVrlXIZn8ACeTNzNrEDegzVMz2jYixgODJe0EHF8IIhLQU9ISuRe6FjCl1g0H9OrpoB0zswZxA9o89SSNJ0fhbg+8VToWESHpX8BLklYDLgZqhtdOmvYG+15z2/zWu9NuPPDTLbu3mVmjeQ60SSpE21bzMWAWsIqklySVWqGfAP8hJVDoBfypkfU1M7P2uQfaBJJOBf4ZERvn9ycDb0bE78rLRsSg8iHcfPxm4GZJLwCHR8R7zai7mZlV5h5oc8xvFG7d5o7CndGIW5iZGe6BNkWFKNz3gOEpNmi29yJiqy64VyEKdz1H4ZqZNYgb0OYpRuFeFBFnNvqGA3qt6EAeM7MGcQPaPJ2Ows3HLwXaSEFGf5Q0JCI+aO+Gz02byf7XPjC/9W6J6w/YvtVVMDNrl+dAm6QLonDfBJYn/Z3tT8qNa2ZmLeIeaBN0URTuNwvX+x6pJ2tmZi3iHmhzdFkUrqQlSbu13Frl89lRuO+9Mb0ztzAzszq4B9oEXRyFew5wX0TcX+Ves6Nwe/Vf31G4ZmYN4ga0eeY7ClfST0kN8DfqKd+/Vw8H45iZNYgb0OaZ3yjc+4HNgOeBq3IU7szGVdfMzNrjBrRJImKCpA5H4ZLS9t0GbAP8M3+2I3AdsHt793xu2tsceO3YLql/R11zwOCW3NfMrFncgDZBF0XhLpHPFWke9IXG19zMzKpxFG5zdEkUrqQ/k3ZkWR+oOIfqKFwzs+ZwA9oEETEGWFXSxyRtwpwo3LGFn5F1XOdQ0hDvU8zdIBfLDI2ItohoW3rFnl35GGZmVuAh3Obpkly4ETFL0pXACcCfu7B+ZmbWAW5Am6euKNxK8rxn/4iYlF/vDTxd67z+vZZzMI+ZWYO4AW2SeqNwJb0O9ASiFIUL3AFcLGlF0hDuisDKte45efr7HHzdP+er3pd+bu35Ot/MbGHlBrSJSlG4NXweWA74RjEKF9hOUhtwDLB/RLzRiDqamVl9HETUBJJOlXR04f3Jkr5fqWxE3EXaeaX8GosDpwE/qHGv2VG47854fT5rbmZm1bgBbY7yZSyHAId1MAr328DwGkkY5orCXWal3vNZbTMzq8ZDuE1QIZn8fyJiu3rPz+d9HtipQVU0M7MOcgPaBJJ6ApOZs4zlijrP+xvwZWBTYAAwKe/gspykSRExoL3z1+m5lIOAzMwaxA1oc/QEBuY/Zy9jkbR4RMyqdlJEfCa/vIXU8JLPm1mr8TQzs8ZyA9ocvwbWyj8fAJdJehkYDGwg6Qbg48AywFKkhraHpA+BLwGPAn8HHgC2BZaRtGxEvNP0JzEzM8BBRM1yIvBcRCwL7ANsCZwUERvkzw+LiM2BNlKav/Vz2ZeAu3OZgcDZEbEhaSeWA5r5AGZmNjc3oK3xSERMLrz/rqTHgRGknujACudMjojS3mSjgX6VLlxcxjJ16tSurLOZmRV4CLc1FpNUagx7kOY3n4qILSTdQxrKLfde4fUsYNlKF46IocBQgLa2tuiyGpuZ2VzcgDbHm8AKxfcRUQok2hf4ekTsLWl9YOtWVNDMzDrGQ7hdRNI9OdXePCLiNWCapCdI2YSQ9FD++FZgCUnjgFNzZSYGAAAYOklEQVRIw7hmZtbNuQfaPAMiokf5wYh4D9iz0gkR0S+/fBXYqHD8t42ooJmZ1W+R7IFK6pd7g6X3x+f8tN+V9KSkcZKuyJ8tL+kiSY9KGpOHXJG0rKQrctkrqTInmcv+Glg2p+y7NB+bmf/cSdK9kq6S9KykX0s6WNIjksZL6p/L9ZF0ba7Ho5LqzmRkZmZdzz3QuZ0IrBMR7+XsQQAnAf+IiMPysUck3Ql8A3g7IgZJGgQ8Vu2iEXGipG9HRLXNOTcBPgm8DjwPXBgRW0o6BvgOcCzwR+D3EfGApL7AbfmcuUg6EjgSoG/fvh3+AszMrD5uQOc2Drg0Jza4IR/bHdhH0vH5/TJAX2BH4AyAiBiX5zA769FSknhJzwG35+PjgZ3z691ISRdK56woaYWImGvnFkfhmpk1x6LagH7I3MPXpWUjnyU1jPsA/ydpQ0DAARHxTPECuSHrqgaquERldWBX4EFS4718Pr4YsI2zD5mZdQ+L5Bwo8AqwqqSVJS0N7EX6Lj4eEXeT9tzsSVqjeRvwHeUWU9Km+Rr3AQfnYxsBg2rc8wNJS9ZRtynA3/LrPZjTuN9O2tKMfM9qw8FmZtYEi2QPNCI+kPQzYCRpl5SngcWBSyStROp1/j4ipks6BfgDMC43oi+QGtxzgT/noduxwCM1bjs0X+OxiDi4cHx3YMeciWgcKcPQVyT1Az4BzMpJF04FTpN0COnv7XlJ70fE56rdcMa0D+v9SszMrIMU4WmyVslDxNcB20XEq5J6A98FZkbEb3NWouMjYlRuvJ8CdoiIqZIuAy6PiJuqXX9g/8Ex8bmx1T42M7MKJI2OiIrr+osW1SHc7mIX4JqIeBUgIl6vVjDSbzp/JfVOewLbkHZomUsxF+6MN15rULXNzGyRHMJtJEkjgaXLDh8SEeMrFadjgUh/Bm4C3gWujoh5xmiLUbgD+w/28IKZWYO4Ae1iEbFVB4rfBVwv6fcR8Voewi2aK4duREyRNAX4MfA/tS6+Ui//9ZqZNUq3H8ItzxrUwPsMk3Rgo+9TFBETgF8A9+YgotPLigwDzssZjEqZjh4gJaN/snk1NTOzcgtFF0XS4hExq9X16IyIuBi4uMpn1wLXlh3+H+Dfja6XmZm1r9v3QLMlJF2c885eI2k5SS9I+omkB4DPSzoi54h9POeMXQ5m9yzPkPSQpOdLvUwlZ+Xct7cAq7ZXgXyvRyU9IWloYV3oPZJ+L+k+SU9J2kLSdZImSvp54fzj8rlPSDo2H6uYk7dw3VNzTtxnJe0g6TFge2BQ7pUe1KXfspmZ1W1BaUA/AQyNiEHAG8DR+fi7EbF9RFwBXBcRW0TEJqTlHocXzl+D1PDsBfw6H9s/X3dj4Ahg2xp1OCtffyNS4vi9Cp+9HxE7AucBNwLfIu2eMiQna9gcOBTYirTf5xGFhAztWSIitiTlwv1pRGwGfBO4MiIGR8SV5ScUo3CnTp1axy3MzKwzFpQG9MWIeDC/voTUGAIUG5CNJN0vaTwpQ9CGhc9uiIiP8rzhavnYjqR1lLMiYgrwjxp12FnSyHz9XcquPzz/OR6YEBEv523Kngc+nut7fUS8FREzSWs/d6jjua/Lf44mJVioKSKGRkRbRLT16dOnnlPMzKwTFpQ50PLlGKX3bxWODQP2i4jHJQ0Bdip8Vsw1q8LrupZ5SFoGOAdoi4gX8zDrMoUipet/VHavj0jfcfGeRdVy8pZfdxYLzt+VmdkiYUHpgfaVtE1+/SVSJGq5FYCXc77Zgyt8Xu4+4IuSFpe0BnN2Pamk1LC9KqkH0NFo3fuA/fLc7fKk4eP7qZyTt5a5lraYmVlr1GxAu8kykqeAr+W8s71JeWjL/R8pt+1jzNnBpD3XAxNJw67nAvdWKxgR04ELctkbgEfruH7x/MdIPeRHch0vjIgxEfEBUMrJezMpJ28td5O2NXMQkZlZC9XMhZuTmt+cg2eqlZnvZSSShuX7XDMf11iiUnae7qZZy27a2tpi1KhRjb6NmdlCpatz4XaHZSQvFJZ1PCJpQOH6p0u6GzhV0hBJZ+XPVpN0fa7T45K2zce/kq8xVtL5khZv577n5qjWCZL+Xz62p6SrCmV2knRTfr27pIclPSbp6jzkW6p/Pd9Xf0kj8mc/kzSzcJ8T8vFxpbpUqK+jcM3MmqDeBrQ7LCMBeCMv6ziLtMVYyXrAbhHx/bLyZwD35jptBkyQ9EngINIOKINJATqz50xzgzu29JPrfRJpv89PSRoE3AFsneczyde7UtIqpDR7u+UlJ6OA4wr1qef7+iPwx4jYgrQ3aKleuwMDgS2BwcDmknYs/4IchWtm1hz1NqDdYRkJwOWFP7cpHL+6ypDoLuT50nyfGcCuwObAo7mB3BVYt3RCROyf11gOzg3s2cCvgDH5mTbIw8S3AntLWgL4LGn959bABsCD+dpfA9Yu1Kee72sb4Or8+rJC+d3zzxjSPO/6pAbVzMxaoN6lES1dRlKlfPH1W+UF2yHg4oj4Uc2C0jrA8cAWETEtz9OWInKvJCVMeB14NCLelCTgjoj4UpVL1vt9Vav3ryLi/Fr1NjOzxqu3B9oly0hyQFIpKXpHlpGUHFT48+F2yu2a51rvAo7K915c0or52IGSVs3He0tau8p19iZF9M6QtBqwZ+Gze0jDwkcwp2c5AtiuMD+7nKT1qly72vc1Ajggv/5i4fhtwGGFOdU1S89gZmbNV28D2pFlJHdQ33KMistI2gvoAZZW2m/zGOB7ddzjGFIGofGkbD4b5mHkHwO35+e5gzRHOxeliN4zSA3XBOAioDSMTR4yvpnUqN6cj00FhgCX52uPIA21VlLt+zoWOE7SI7leM/K1bycN6T6cn+cavB7UzKxlag7hRsQLpHm9cv3Kyp1LhYY1IoaUHZoo6WJgU+BZoA14ktRAHUuK+F0BOBJYCpgEHJLPXZ/U6LSRGsAfRMSQUkQvac5zcv4hIl4B9q1Q91NJvcZSr/dVmL2U5vVct8dyQzUzIj6Ze6DnAd+T9D3gqIj4tqQRwD2Slsp1OzoHAJV/D/0kzZR0NrAbMI3Uk/4NaQ712Fx0ceB9Us93CPBcrtv+pB7xIGB10i8cHRm6NjOzLtSKTESLTERvBcsD90TE5qSMQj8nbU+2PymhAsBawEqkX26mAr0AIuJ64D+kedcLSMnl/1N+Ay9jMTNrjlbkVy2P6P1ufn0lpGUkpAjVNUi9scVIgTn9NCfZwkfAk7lXCIWIXmCKpI5G9P4+Dw0PJDVso1M8EMWkDrsAX4XZw7czJB3CnIheSPO7/23nnu+TonchDV2/FxEf5J5uv3z8UeBx0lKVpYD+hfO/AzwBjIiIy6kgIoYCQyElUminLmZmNh9a0YC2G9EbEftLmkzq1TUtojcitlJZNqR879XbuUbdEb3ZBzEn9dPsxPMR8VFeDgNpbvcVYBPSLw/vFs5fM5+3mqTF8i8SZmbWAh0awlXX5MWtJ6J3DVKigPlKDC9pH0knVjmn3ojekvmN6C23H2nIGUkXMueXgZWAl3PjeAipF05uYP8MfJk0rH1c+QXNzKx5unwOtEYULdQX0TuGlLxgfiJ6F4uI4RHx6yrnNC2it5aI+DpzesTnkL6fEaT52FKg0P8C90fE/aTG8+t5DtbMzFqgM0O4S5RF0X6VOVG0uwNnVYqijYi3gZOBO0lRtD1I85Zv54QFZ0oqRdFOA75Vnli+FNEr6QXSnOmTebnHl3NE7DDmRNFupZRfti1/VoqiXRf4GPBIRPw/SV8BLitE0V5fuN8wUsIDIuIVSbuSMhPtBpwi6X9JvdIVgWMjYnjunZ5GGnZeGjg7Is7PSRaGSXoyP+MUoJQ/9x7mDFMfR5orXQF4PyJ65OOHARdLegxYkpSEoZ5fLszMrAE60wNdGKJopwBPNyiK9nBgRl7KsgVwRP4Fod5nPCnvAlDMvVvyas6xey4pQ9I8HIVrZtYcnemBthtFm20k6edAT1JP87bCZzc0Ioq2cLyYF/c7pDnX7YGNgPUlPRUR/QAkfZuuj6LdHfispJPy+8VIve6H6nzGL0g6kvR3swZpDe64/Nl1+c/RwOcqnewoXDOz5uhMA7og5cU9kzlDuFOBLSOi/P5dHUUr0rMXf2lA0h+o8YxqP/cuzPnuZtGaCGozM8s6M4S7SObFlbQPae6xltuAo/KzI2k9pW3P6nnGFUm/AJRy7+5NfVHIZmbWZJ3pxZSiaM8nRb6eSxoqLSrlef0naaizVs7W60mJCsaTApNm58Wtsk0ZzImiXYzUkNdyDDBU0uGkHtxREfGwpFIU7WLAB6RMP/8snqiUF3e4pA/quM+FpOHcx3Lg0FTSkpWKz1iUe+xjSLl3n89lhtdxTzMza7IONaDOi5sicnPvcBNg3ZyN6KiI6JEjer+b6/oQKS9u8ReAb5deSJoJPCPpR6So48VyNG5f5kT07kQa0h2Wf34jad1cphg4ZWZmTdaKXLhFC0NEbyPz4pZbH/g0sCXw09IwcZGjcM3MmqPVgSjOi5tUi+gtd0sOgnpP0n+B1YCXigUchWtm1hyt7oHWzItLauS3i4hlgW+Qh1izhuXFJc09fj8iBuce5UuVT53r/heXykfEJyLi5HbKV43opfovNsXndSSumVkLtboB7ZKI3jKNjOgt6eq8uGZmtoBpdQNaiuh9CvgClfPiliJ65ycvLpACg/KSlnIdzYt7C3BkI/LiFuo6BFi5ymc7kQKJzMysRTRnFLGFlUhrQm+OiI3aKdPekpZ67zOMwnZl+dgLpGQLr1Y7r+waS0TEh/NTjzrvcw9wfESMqvDZTvmzvdq7RltbW4waNc/pZmbWDkmjc0rVdnWnObROJ6nPDeMbpCUtqwM/iIhr8jrMM5mzpEW0Q3OS1JeGfb8cEZOqLGmplKQe0pKWh8qWtIxk3iUtpXsuDvwp1z3y876Y318q6R1gG+BTpAjhV4HH2nmGI/N3RN++7qSamTVKq4dwixq9pGUx0hKQ0ySNzT+fjoh+Zb3PLl3SQgr8OQB4vnDfjQvnDwbWjIiNImJj4M+5hzwKODgHMAVwASkz0Q60s8l3RAyNiLaIaOvTp0+1YmZmNp+6UwNavqRl+/y6PEn9/bkHeDCwYeGzGyLiozwXOc+SlojYE7gROKEQKTtXvtqsuKRlm8Lxqyv1IEm923MhLWmJiBnAruQlLaQtzV4jNYyl+44vnP88KSHDmZL2IP3yUG59YHJETMyRu5dUKGNmZk3UnYZwF6Qk9bXUnaQ+J43fhNQ7/hYpmOqwGvUyM7MWa3oPVFI/SU9U+KhLl7TkecsPmM8lLTmJ/MbtlJ/fJPWrAItFxLWkiOPN8kdvMieH8NPAOpL65/f15P41M7MG6k5DuKUlLeOA3nTNkpaRVFnS0o7ikpbjI2J4Pr+aY4Cd52NJy5rAPZLGknrYpV7rMOC8fFykwKBbJD1AWbJ7MzNrvlYN4VaKuF0OmEKaA7ya1MOcCtwlqRRxe66krShE3Eo6sEIS+XuBVQEi4ttUUCniNv+5PvBgrltprefMHNU7V8StpG1zxO3VzIm4HSLpkYi4krnnbytG3EbE7yW9QV6yImkVSS/kdIUrkHZyuYq0Ifjv8j0OIaXz6x0Rr5fdw1G4ZmZN0Koe6KKaRH6eiNs66rgRqXHfEvgF8HZEbErKmPTV8sKOwjUza45W9UDbTSKfbSTp50BPoAdpo+qSG+YniXxOUv8x4GBJn8+H142IFfPc6a3tRNzOTxL584GNJU0l/eLwZj6/PXdHxJu57Azgpnx8PDCoxrlmZtYgrWpAWxpxGxH75yHcz0bE5ByU9HKhSKMibtsk9SBF3A4BpkbEeEkfMmc0YJmy04rP+lHhfXtJ583MrMFaNYS7SCaRbyfitjfww/y6mKu3J7BHHfWq6MP/Tue/Zw/v7OlmZtaOVjWgjYi4rZpEvh0dTSI/vxG3fakccfsQsI2kh4BVCuWnM2fPUDMz60a6RTL5VpD0EvAOqfEqRgNvA/yWNDz6KKnHuQlwYkR8TtK+wBXASqRfQJ6MiHXzGs2zgT7A28AREfF0eR7dCoFJSDoZ6E9a0vJx4DcRcUExyX4ext6HFK3cH7g+In7Q3jMO7jsgbv/h6az6rX069R2ZmS2KFsRk8q0wABgSEQ9Kugg4jrRp964R8aykv5Aa0LNIDSCkXLRPAFuQvr+R+fhQ4JsRMTEvtTmHFHQEc6J629tNZhCwNbA8MEbSLRXKDM71eA94RtKZEfFisUBxGctavRyFa2bWKN0pkUJDSLq+kMR9dhJ50jKY8mjgXUk5Z5/Nxy4Gdszbl03KS1a2BE4nRf3uANyfA4O2Ba7Ow7Pnk4Zkx5J6jRsDo8uSyJe7MSLeyYnt7873KXdXRMyIiHdJO9XMM9daXMayco8V6/+izMysQxb6HmhE7F/peB4e7cj49f3AnqT0gHeS5jAXB44n/SIyPa8DLb/PMMr2IK1W1RrvYe6I3FnU+PtbYtWeHr41M2uQhb4BraGvpG0i4mFSNPCdwDckDYiISaSMP6VgpPuAvwB/iYipklYmbSs2ISJC0mRJn4+Iq5UWhA6KiMc7UJd9Jf2KNIS7E3AiKetQp40ePXqmpGfm5xrdyCqkvVAXdAvLc8DC8ywLy3PAwvMsrX6Oiispyi3qDWgpGvh8UgTvMcAI0lBsKYjovFx2JGmbtPvy+3HAf2NOFNbBwLmSfgwsSQo06kgD+ghwCylS95SImJJ7yfPjmXomwhcEkkYtDM+ysDwHLDzPsrA8Byw8z7KgPMeiHIXbjxzh2uKqNMyC8o+wHgvLsywszwELz7MsLM8BC8+zLCjPsdAHEZmZmTXCIjuEGxEvkBK1N42kQ0nDxEUPRsS3GnTLoQ26bissLM+ysDwHLDzPsrA8Byw8z7JAPMciO4RrZmY2PzyEa2Zm1gluQBcCkvaQ9IykSZJOrPD50pKuzJ+P7ILo3oao4zmOk/SkpHGS7qqWtL87qPUshXIHSgpJ3TJgop7nkPSF/PcyQdJlza5jver499VX0t2SxuR/Y59pRT1rkXSRpP9KeqLK55J0Rn7OcZI2q1Su1ep4joNz/cdJekjSJs2uY00R4Z8F+IeUzOE5YF3SutHHgQ3KyhwNnJdffxG4stX17uRz7Awsl18f1R2fo95nyeVWIC2LGgG0tbrenfw7GQiMAXrl96u2ut7z8SxDgaPy6w2AF1pd7yrPsiNpJ6cnqnz+GeDvpK0WtwZGtrrOnXyObQv/rvbsjs/hHuiCb0tgUkQ8HxHvk9af7ltWZl9SWkKAa4Bdc7KH7qTmc0TE3RHxdn47AliryXWsVz1/JwCnAL8B3m1m5Tqgnuc4Ajg7IqYBRES1zeRbrZ5nCaCU/3IlYEoT61e3iLiPtEFFNfuSEr5ERIwAeipt8dit1HqOiHio9O+KbvrfuxvQBd+aQDGh/Ev5WMUykfL6zgBWbkrt6lfPcxQdTvotuzuq+SySNgU+HhE3N7NiHVTP38l6wHqSHpQ0QlKn969tsHqe5WTgK3mnpr8B32lO1bpcR/9bWhB0y//eF9llLAuRSj3J8tDqesq0Wt11lPQVoA34VENr1HntPoukxYDfA0OaVaFOqufvZAnSMO5OpB7C/ZI2iojpDa5bR9XzLF8ChkXE7yRtA/w1P8tHja9el1oQ/nuvm6SdSQ3o9q2uSzn3QBd8L5H2EC1Zi3mHnmaXySkKV6L9IaBWqOc5kLQbcBKwT0S8V/55N1HrWVYgrUG+R9ILpHmq4d0wkKjef1s3RsQHETEZeIbUoHY39TzL4cBVAJHyYy/D3BvcLyjq+m9pQSBpEHAhsG9EvNbq+pRzA7rgexQYKGkdSUuRgoSGl5UZDnwtvz4Q+EfkmflupOZz5GHP80mNZ3eda4MazxJpS7pVIqJfRPQjze/sExGjWlPdqur5t3UDKbgLSauQhnSfb2ot61PPs/yLtKUhSlsXLgNMbWotu8Zw4Ks5GndrYEZEvNzqSnWUpL7AdcAhMWeLyW7FQ7gLuIj4UNK3gdtIkYYXRcQEST8DRkXEcOBPpOGoSaSe5xdbV+PK6nyO04AepGT/AP+KiG63X1udz9Lt1fkctwG7S3qStMXeCd2xp1Dns3wfuEDS90hDnkO64S+aSLqcNGS+Sp6v/SlpAwsi4jzS/O1ngEnA28Chralp++p4jp+QYjXOyf+9fxjdLD+uMxGZmZl1godwzczMOsENqJmZWSe4ATUzM+sEN6BmZmad4AbUzMysE9yAmpmZdYIbUDMzs05wA2pmZtYJ/x/DEtGGUFwNTgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = Ridge().fit(train_X, train_y_ln)\n",
    "print('intercept:'+ str(model.intercept_))\n",
    "sns.barplot(abs(model.coef_), continuous_feature_names)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "L1正则化有助于生成一个稀疏权值矩阵，进而可以用于特征选择。如下图，我们发现power与userd_time特征非常重要。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "intercept:8.674427764003347\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1fea90b69b0>"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = Lasso().fit(train_X, train_y_ln)\n",
    "print('intercept:'+ str(model.intercept_))\n",
    "sns.barplot(abs(model.coef_), continuous_feature_names)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "除此之外，决策树通过信息熵或GINI指数选择分裂节点时，优先选择的分裂特征也更加重要，这同样是一种特征选择的方法。XGBoost与LightGBM模型中的model_importance指标正是基于此计算的"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.4.3 - 2 非线性模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "除了线性模型以外，还有许多我们常用的非线性模型如下，在此篇幅有限不再一一讲解原理。我们选择了部分常用模型与线性模型进行效果比对。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.tree import DecisionTreeRegressor\n",
    "from sklearn.ensemble import RandomForestRegressor\n",
    "from sklearn.ensemble import GradientBoostingRegressor\n",
    "from sklearn.neural_network import MLPRegressor\n",
    "from xgboost.sklearn import XGBRegressor\n",
    "from lightgbm.sklearn import LGBMRegressor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "models = [LinearRegression(),\n",
    "          DecisionTreeRegressor(),\n",
    "          RandomForestRegressor(),\n",
    "          GradientBoostingRegressor(),\n",
    "          MLPRegressor(solver='lbfgs', max_iter=100), \n",
    "          XGBRegressor(n_estimators = 100, objective='reg:squarederror'), \n",
    "          LGBMRegressor(n_estimators = 100)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LinearRegression is finished\n",
      "DecisionTreeRegressor is finished\n",
      "RandomForestRegressor is finished\n",
      "GradientBoostingRegressor is finished\n",
      "MLPRegressor is finished\n",
      "XGBRegressor is finished\n",
      "LGBMRegressor is finished\n"
     ]
    }
   ],
   "source": [
    "result = dict()\n",
    "for model in models:\n",
    "    model_name = str(model).split('(')[0]\n",
    "    scores = cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error))\n",
    "    result[model_name] = scores\n",
    "    print(model_name + ' is finished')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>LinearRegression</th>\n",
       "      <th>DecisionTreeRegressor</th>\n",
       "      <th>RandomForestRegressor</th>\n",
       "      <th>GradientBoostingRegressor</th>\n",
       "      <th>MLPRegressor</th>\n",
       "      <th>XGBRegressor</th>\n",
       "      <th>LGBMRegressor</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>cv1</th>\n",
       "      <td>0.191642</td>\n",
       "      <td>0.184566</td>\n",
       "      <td>0.136266</td>\n",
       "      <td>0.168626</td>\n",
       "      <td>124.299426</td>\n",
       "      <td>0.168698</td>\n",
       "      <td>0.141159</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cv2</th>\n",
       "      <td>0.194986</td>\n",
       "      <td>0.187029</td>\n",
       "      <td>0.139693</td>\n",
       "      <td>0.171905</td>\n",
       "      <td>257.886236</td>\n",
       "      <td>0.172258</td>\n",
       "      <td>0.143363</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cv3</th>\n",
       "      <td>0.192737</td>\n",
       "      <td>0.184839</td>\n",
       "      <td>0.136871</td>\n",
       "      <td>0.169553</td>\n",
       "      <td>236.829589</td>\n",
       "      <td>0.168604</td>\n",
       "      <td>0.142137</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cv4</th>\n",
       "      <td>0.195329</td>\n",
       "      <td>0.182605</td>\n",
       "      <td>0.138689</td>\n",
       "      <td>0.172299</td>\n",
       "      <td>130.197264</td>\n",
       "      <td>0.172474</td>\n",
       "      <td>0.143461</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>cv5</th>\n",
       "      <td>0.194450</td>\n",
       "      <td>0.186626</td>\n",
       "      <td>0.137420</td>\n",
       "      <td>0.171206</td>\n",
       "      <td>268.090236</td>\n",
       "      <td>0.170898</td>\n",
       "      <td>0.141921</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     LinearRegression  DecisionTreeRegressor  RandomForestRegressor  \\\n",
       "cv1          0.191642               0.184566               0.136266   \n",
       "cv2          0.194986               0.187029               0.139693   \n",
       "cv3          0.192737               0.184839               0.136871   \n",
       "cv4          0.195329               0.182605               0.138689   \n",
       "cv5          0.194450               0.186626               0.137420   \n",
       "\n",
       "     GradientBoostingRegressor  MLPRegressor  XGBRegressor  LGBMRegressor  \n",
       "cv1                   0.168626    124.299426      0.168698       0.141159  \n",
       "cv2                   0.171905    257.886236      0.172258       0.143363  \n",
       "cv3                   0.169553    236.829589      0.168604       0.142137  \n",
       "cv4                   0.172299    130.197264      0.172474       0.143461  \n",
       "cv5                   0.171206    268.090236      0.170898       0.141921  "
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result = pd.DataFrame(result)\n",
    "result.index = ['cv' + str(x) for x in range(1, 6)]\n",
    "result"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看到随机森林模型在每一个fold中均取得了更好的效果"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.4.4  模型调参"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在此我们介绍了三种常用的调参方法如下：\n",
    "\n",
    "  - 贪心算法 https://www.jianshu.com/p/ab89df9759c8\n",
    "  - 网格调参 https://blog.csdn.net/weixin_43172660/article/details/83032029\n",
    "  - 贝叶斯调参 https://blog.csdn.net/linxid/article/details/81189154"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "## LGB的参数集合：\n",
    "\n",
    "objective = ['regression', 'regression_l1', 'mape', 'huber', 'fair']\n",
    "\n",
    "num_leaves = [3,5,10,15,20,40, 55]\n",
    "max_depth = [3,5,10,15,20,40, 55]\n",
    "bagging_fraction = []\n",
    "feature_fraction = []\n",
    "drop_rate = []"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.4.4 - 1 贪心调参"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "best_obj = dict()\n",
    "for obj in objective:\n",
    "    model = LGBMRegressor(objective=obj)\n",
    "    score = np.mean(cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error)))\n",
    "    best_obj[obj] = score\n",
    "    \n",
    "best_leaves = dict()\n",
    "for leaves in num_leaves:\n",
    "    model = LGBMRegressor(objective=min(best_obj.items(), key=lambda x:x[1])[0], num_leaves=leaves)\n",
    "    score = np.mean(cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error)))\n",
    "    best_leaves[leaves] = score\n",
    "    \n",
    "best_depth = dict()\n",
    "for depth in max_depth:\n",
    "    model = LGBMRegressor(objective=min(best_obj.items(), key=lambda x:x[1])[0],\n",
    "                          num_leaves=min(best_leaves.items(), key=lambda x:x[1])[0],\n",
    "                          max_depth=depth)\n",
    "    score = np.mean(cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error)))\n",
    "    best_depth[depth] = score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1fea93f6080>"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.lineplot(x=['0_initial','1_turning_obj','2_turning_leaves','3_turning_depth'], y=[0.143 ,min(best_obj.values()), min(best_leaves.values()), min(best_depth.values())])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.4.4 - 2 Grid Search 调参"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import GridSearchCV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "parameters = {'objective': objective , 'num_leaves': num_leaves, 'max_depth': max_depth}\n",
    "model = LGBMRegressor()\n",
    "clf = GridSearchCV(model, parameters, cv=5)\n",
    "clf = clf.fit(train_X, train_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': 15, 'num_leaves': 55, 'objective': 'regression'}"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.best_params_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = LGBMRegressor(objective='regression',\n",
    "                          num_leaves=55,\n",
    "                          max_depth=15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.13626164479243302"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 5.4.4 - 3 贝叶斯调参"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "from bayes_opt import BayesianOptimization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "def rf_cv(num_leaves, max_depth, subsample, min_child_samples):\n",
    "    val = cross_val_score(\n",
    "        LGBMRegressor(objective = 'regression_l1',\n",
    "            num_leaves=int(num_leaves),\n",
    "            max_depth=int(max_depth),\n",
    "            subsample = subsample,\n",
    "            min_child_samples = int(min_child_samples)\n",
    "        ),\n",
    "        X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error)\n",
    "    ).mean()\n",
    "    return 1 - val"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "rf_bo = BayesianOptimization(\n",
    "    rf_cv,\n",
    "    {\n",
    "    'num_leaves': (2, 100),\n",
    "    'max_depth': (2, 100),\n",
    "    'subsample': (0.1, 1),\n",
    "    'min_child_samples' : (2, 100)\n",
    "    }\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "|   iter    |  target   | max_depth | min_ch... | num_le... | subsample |\n",
      "-------------------------------------------------------------------------\n",
      "| \u001b[0m 1       \u001b[0m | \u001b[0m 0.8649  \u001b[0m | \u001b[0m 89.57   \u001b[0m | \u001b[0m 47.3    \u001b[0m | \u001b[0m 55.13   \u001b[0m | \u001b[0m 0.1792  \u001b[0m |\n",
      "| \u001b[0m 2       \u001b[0m | \u001b[0m 0.8477  \u001b[0m | \u001b[0m 99.86   \u001b[0m | \u001b[0m 60.91   \u001b[0m | \u001b[0m 15.35   \u001b[0m | \u001b[0m 0.4716  \u001b[0m |\n",
      "| \u001b[95m 3       \u001b[0m | \u001b[95m 0.8698  \u001b[0m | \u001b[95m 81.74   \u001b[0m | \u001b[95m 83.32   \u001b[0m | \u001b[95m 92.59   \u001b[0m | \u001b[95m 0.9559  \u001b[0m |\n",
      "| \u001b[0m 4       \u001b[0m | \u001b[0m 0.8627  \u001b[0m | \u001b[0m 90.2    \u001b[0m | \u001b[0m 8.754   \u001b[0m | \u001b[0m 43.34   \u001b[0m | \u001b[0m 0.7772  \u001b[0m |\n",
      "| \u001b[0m 5       \u001b[0m | \u001b[0m 0.8115  \u001b[0m | \u001b[0m 10.07   \u001b[0m | \u001b[0m 86.15   \u001b[0m | \u001b[0m 4.109   \u001b[0m | \u001b[0m 0.3416  \u001b[0m |\n",
      "| \u001b[95m 6       \u001b[0m | \u001b[95m 0.8701  \u001b[0m | \u001b[95m 99.15   \u001b[0m | \u001b[95m 9.158   \u001b[0m | \u001b[95m 99.47   \u001b[0m | \u001b[95m 0.494   \u001b[0m |\n",
      "| \u001b[0m 7       \u001b[0m | \u001b[0m 0.806   \u001b[0m | \u001b[0m 2.166   \u001b[0m | \u001b[0m 2.416   \u001b[0m | \u001b[0m 97.7    \u001b[0m | \u001b[0m 0.224   \u001b[0m |\n",
      "| \u001b[0m 8       \u001b[0m | \u001b[0m 0.8701  \u001b[0m | \u001b[0m 98.57   \u001b[0m | \u001b[0m 97.67   \u001b[0m | \u001b[0m 99.87   \u001b[0m | \u001b[0m 0.3703  \u001b[0m |\n",
      "| \u001b[95m 9       \u001b[0m | \u001b[95m 0.8703  \u001b[0m | \u001b[95m 99.87   \u001b[0m | \u001b[95m 43.03   \u001b[0m | \u001b[95m 99.72   \u001b[0m | \u001b[95m 0.9749  \u001b[0m |\n",
      "| \u001b[0m 10      \u001b[0m | \u001b[0m 0.869   \u001b[0m | \u001b[0m 10.31   \u001b[0m | \u001b[0m 99.63   \u001b[0m | \u001b[0m 99.34   \u001b[0m | \u001b[0m 0.2517  \u001b[0m |\n",
      "| \u001b[95m 11      \u001b[0m | \u001b[95m 0.8703  \u001b[0m | \u001b[95m 52.27   \u001b[0m | \u001b[95m 99.56   \u001b[0m | \u001b[95m 98.97   \u001b[0m | \u001b[95m 0.9641  \u001b[0m |\n",
      "| \u001b[0m 12      \u001b[0m | \u001b[0m 0.8669  \u001b[0m | \u001b[0m 99.89   \u001b[0m | \u001b[0m 8.846   \u001b[0m | \u001b[0m 66.49   \u001b[0m | \u001b[0m 0.1437  \u001b[0m |\n",
      "| \u001b[0m 13      \u001b[0m | \u001b[0m 0.8702  \u001b[0m | \u001b[0m 68.13   \u001b[0m | \u001b[0m 75.28   \u001b[0m | \u001b[0m 98.71   \u001b[0m | \u001b[0m 0.153   \u001b[0m |\n",
      "| \u001b[0m 14      \u001b[0m | \u001b[0m 0.8695  \u001b[0m | \u001b[0m 84.13   \u001b[0m | \u001b[0m 86.48   \u001b[0m | \u001b[0m 91.9    \u001b[0m | \u001b[0m 0.7949  \u001b[0m |\n",
      "| \u001b[0m 15      \u001b[0m | \u001b[0m 0.8702  \u001b[0m | \u001b[0m 98.09   \u001b[0m | \u001b[0m 59.2    \u001b[0m | \u001b[0m 99.65   \u001b[0m | \u001b[0m 0.3275  \u001b[0m |\n",
      "| \u001b[0m 16      \u001b[0m | \u001b[0m 0.87    \u001b[0m | \u001b[0m 68.97   \u001b[0m | \u001b[0m 98.62   \u001b[0m | \u001b[0m 98.93   \u001b[0m | \u001b[0m 0.2221  \u001b[0m |\n",
      "| \u001b[0m 17      \u001b[0m | \u001b[0m 0.8702  \u001b[0m | \u001b[0m 99.85   \u001b[0m | \u001b[0m 63.74   \u001b[0m | \u001b[0m 99.63   \u001b[0m | \u001b[0m 0.4137  \u001b[0m |\n",
      "| \u001b[0m 18      \u001b[0m | \u001b[0m 0.8703  \u001b[0m | \u001b[0m 45.87   \u001b[0m | \u001b[0m 99.05   \u001b[0m | \u001b[0m 99.89   \u001b[0m | \u001b[0m 0.3238  \u001b[0m |\n",
      "| \u001b[0m 19      \u001b[0m | \u001b[0m 0.8702  \u001b[0m | \u001b[0m 79.65   \u001b[0m | \u001b[0m 46.91   \u001b[0m | \u001b[0m 98.61   \u001b[0m | \u001b[0m 0.8999  \u001b[0m |\n",
      "| \u001b[0m 20      \u001b[0m | \u001b[0m 0.8702  \u001b[0m | \u001b[0m 99.25   \u001b[0m | \u001b[0m 36.73   \u001b[0m | \u001b[0m 99.05   \u001b[0m | \u001b[0m 0.1262  \u001b[0m |\n",
      "| \u001b[0m 21      \u001b[0m | \u001b[0m 0.8702  \u001b[0m | \u001b[0m 85.51   \u001b[0m | \u001b[0m 85.34   \u001b[0m | \u001b[0m 99.77   \u001b[0m | \u001b[0m 0.8917  \u001b[0m |\n",
      "| \u001b[0m 22      \u001b[0m | \u001b[0m 0.8696  \u001b[0m | \u001b[0m 99.99   \u001b[0m | \u001b[0m 38.51   \u001b[0m | \u001b[0m 89.13   \u001b[0m | \u001b[0m 0.9884  \u001b[0m |\n",
      "| \u001b[0m 23      \u001b[0m | \u001b[0m 0.8701  \u001b[0m | \u001b[0m 63.29   \u001b[0m | \u001b[0m 97.93   \u001b[0m | \u001b[0m 99.94   \u001b[0m | \u001b[0m 0.9585  \u001b[0m |\n",
      "| \u001b[0m 24      \u001b[0m | \u001b[0m 0.8702  \u001b[0m | \u001b[0m 93.04   \u001b[0m | \u001b[0m 71.42   \u001b[0m | \u001b[0m 99.94   \u001b[0m | \u001b[0m 0.9646  \u001b[0m |\n",
      "| \u001b[0m 25      \u001b[0m | \u001b[0m 0.8701  \u001b[0m | \u001b[0m 99.73   \u001b[0m | \u001b[0m 16.21   \u001b[0m | \u001b[0m 99.38   \u001b[0m | \u001b[0m 0.9778  \u001b[0m |\n",
      "| \u001b[0m 26      \u001b[0m | \u001b[0m 0.87    \u001b[0m | \u001b[0m 86.28   \u001b[0m | \u001b[0m 58.1    \u001b[0m | \u001b[0m 99.47   \u001b[0m | \u001b[0m 0.107   \u001b[0m |\n",
      "| \u001b[0m 27      \u001b[0m | \u001b[0m 0.8703  \u001b[0m | \u001b[0m 47.28   \u001b[0m | \u001b[0m 99.83   \u001b[0m | \u001b[0m 99.65   \u001b[0m | \u001b[0m 0.4674  \u001b[0m |\n",
      "| \u001b[0m 28      \u001b[0m | \u001b[0m 0.8703  \u001b[0m | \u001b[0m 68.29   \u001b[0m | \u001b[0m 99.51   \u001b[0m | \u001b[0m 99.4    \u001b[0m | \u001b[0m 0.2757  \u001b[0m |\n",
      "| \u001b[0m 29      \u001b[0m | \u001b[0m 0.8701  \u001b[0m | \u001b[0m 76.49   \u001b[0m | \u001b[0m 73.41   \u001b[0m | \u001b[0m 99.86   \u001b[0m | \u001b[0m 0.9394  \u001b[0m |\n",
      "| \u001b[0m 30      \u001b[0m | \u001b[0m 0.8695  \u001b[0m | \u001b[0m 37.27   \u001b[0m | \u001b[0m 99.87   \u001b[0m | \u001b[0m 89.87   \u001b[0m | \u001b[0m 0.7588  \u001b[0m |\n",
      "=========================================================================\n"
     ]
    }
   ],
   "source": [
    "rf_bo.maximize()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.1296693644053145"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1 - rf_bo.max['target']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 总结"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在本章中，我们完成了建模与调参的工作，并对我们的模型进行了验证。此外，我们还采用了一些基本方法来提高预测的精度，提升如下图所示。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1feac73ceb8>"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 936x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(13,5))\n",
    "sns.lineplot(x=['0_origin','1_log_transfer','2_L1_&_L2','3_change_model','4_parameter_turning'], y=[1.36 ,0.19, 0.19, 0.14, 0.13])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Task5 建模调参 END.**\n",
    "\n",
    "--- By: 小雨姑娘  \n",
    "\n",
    "    数据挖掘爱好者，多次获比赛TOP名次。\n",
    "    作者的机器学习笔记：https://zhuanlan.zhihu.com/mlbasic"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**关于Datawhale：**\n",
    "\n",
    "> Datawhale是一个专注于数据科学与AI领域的开源组织，汇集了众多领域院校和知名企业的优秀学习者，聚合了一群有开源精神和探索精神的团队成员。Datawhale 以“for the learner，和学习者一起成长”为愿景，鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案，赋能人才培养，助力人才成长，建立起人与人，人与知识，人与企业和人与未来的联结。\n",
    "\n",
    "本次数据挖掘路径学习，专题知识将在天池分享，详情可关注Datawhale：\n",
    "（图片！！！）"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
